本文介绍如何使用CreateFileMapping,MapViewOfFile创建内存映射文件,如何向内存映射文件中写入数据,读取数据。
#define BAD_POS 0xFFFFFFFF // returned by SetFilePointer and GetFileSize |
typedef DWORD mmf_share_mode; |
typedef DWORD mmf_access_mode; |
cout<< "create memorymapfile..." <<endl; |
const char * shared_name = "testMmf" ; |
const char * file_name = "d:\\testMmf.mmf" ; |
const DWORD mmf_size = 512*1024; |
mmf_access_mode access_mode = (GENERIC_READ|GENERIC_WRITE); |
mmf_share_mode share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE; |
mmf_flags flags = FILE_FLAG_SEQUENTIAL_SCAN; |
if (mmHandle == INVALID_HANDLE_VALUE) { |
error_code = GetLastError(); |
cout<< "创建mmf失败:" <<error_code<<endl; |
DWORD file_size = GetFileSize(mmHandle, &high_size); |
if (file_size == BAD_POS && (error_code = GetLastError()) != SUCCESS) { |
cout<< "error:" <<error_code<<endl; |
cout<< "create mmf sucessfully" <<endl; |
HANDLE mmfm = CreateFileMapping(mmHandle, |
error_code = GetLastError(); |
if (SUCCESS != error_code){ |
cout<< "createFileMapping error" <<error_code<<endl; |
if (mmHandle != INVALID_HANDLE_VALUE){ |
size_t view_size = 1024*256; |
DWORD view_access = FILE_MAP_ALL_ACCESS; |
char * mmfm_base_address = ( char *)MapViewOfFile(mmfm,view_access,0,0,view_size); |
if (mmfm_base_address == NULL){ |
error_code = GetLastError(); |
if (error_code != SUCCESS){ |
cout<< "error code " <<error_code<<endl; |
char write_chars[] = "hello chars" ; |
const size_t write_chars_size = sizeof (write_chars); |
CopyMemory(( PVOID )mmfm_base_address, write_chars, write_chars_size); |
char read_chars[write_chars_size]; |
memcpy (read_chars,mmfm_base_address,write_chars_size); |
cout<< "read chars " <<read_chars<<endl; |
UnmapViewOfFile(mmfm_base_address); |