導致崩潰的原因是因爲該文件必須以GENERIC_READ
和GENERIC_WRITE
訪問權限,因爲在創建CreateFileMapping()
功能代碼指定PAGE_READWRITE
作爲其第三個參數(flProtect
)。這是從CreateFileMapping
MSDN文檔:
文件必須能與 的flProtect參數指定保護標誌不兼容的訪問權限打開
PAGE_READWRITE =>給出一個特定的讀/寫訪問頁面區域。 hFile指定的文件必須使用GENERIC_READ 和GENERIC_WRITE訪問權限創建。
所以更改
hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
到
hFile=CreateFile("temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
一件事,你不能將文件映射與一個大小爲零。下面是從MSDN文檔的CreateFileMapping()
功能:
如果此參數(dwMaximumSizeLow)和dwMaximumSizeHigh是0(零)時,文件映射對象的最大尺寸 是等於文件 該HFILE的當前大小標識。
嘗試映射長度爲0(零)的文件失敗,並顯示錯誤 代碼ERROR_FILE_INVALID。應用程序應測試長度爲0(零)的文件,並拒絕這些文件。
如果應用程序指定的文件映射對象比在磁盤上的實際命名的文件的大小較大的 的尺寸,上 磁盤上的文件被增加以匹配文件映射 對象的指定大小。
所以你的情況,因爲你試圖映射文件已初步大小爲0,除非你在CreateFileMapping()
的dwMaximumSizeLow/dwMaximumSizeHigh
參數指定文件映射對象的大小CreateFileMapping()
功能將失敗。你可以做這樣的事情...
HANDLE hFile, hMapFile;
LPVOID lpMapAddress;
//mapping of memory
hFile=CreateFile(L"temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
char* str="shared data to be written";//the data you want to write to the file
int strLen=::strlen(str);//get the string length of the data you want to write
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,strLen, TEXT("SharedObject")); //here you also specify the size of the mapping object to be equal to the size of data you want to write
if (hMapFile != NULL && hMapFile != INVALID_HANDLE_VALUE)
{
lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
//writing into shared memory
if(lpMapAddress!=NULL)
sprintf((char*)lpMapAddress,"%s","shared file write");
else
printf("error");//error message MapViewOfFile() failed
UnmapViewOfFile(lpMapAddress);
CloseHandle(hMapFile);
}
else
printf("error");//error message CreateFileMapping() failed
CloseHandle(hFile);
}
else
printf("error");//error message CreateFile() failed
代碼步進與調試? Depends.exe分析?錯誤信息? – Ceros
您是否必須映射內存映射文件大於0字節的文件?儘管上次我使用WINAPI查看內存映射文件的時間是20世紀90年代後期。 – drescherjm
不顯示錯誤消息。它立即崩潰@ceros –