2016-04-07 134 views
-3

該程序應該使用win32 API寫入共享內存。這是一個程序給它,因爲它是在教科書,但是當我嘗試執行它失敗。它崩潰當我點擊執行該程序在執行時崩潰

程序應該是一個字符串寫入共享內存

#include<windows.h> 
#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 
    HANDLE hFile, hMapFile; 
    LPVOID lpMapAddress; 
    //mapping of memory 
    hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);  
    hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,0, TEXT("SharedObject")); 
    lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
    //writing into shared memory 
    sprintf((char*)lpMapAddress,"shared memory writing"); 


    UnmapViewOfFile(lpMapAddress); 
    CloseHandle(hFile); 
    CloseHandle(hMapFile); 
} 
+3

代碼步進與調試? Depends.exe分析?錯誤信息? – Ceros

+1

您是否必須映射內存映射文件大於0字節的文件?儘管上次我使用WINAPI查看內存映射文件的時間是20世紀90年代後期。 – drescherjm

+0

不顯示錯誤消息。它立即崩潰@ceros –

回答

3

導致崩潰的原因是因爲該文件必須以GENERIC_READGENERIC_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 
+0

我已經試過這個說法,但結果仍然是一樣的! –

+0

我認爲sprintf語句存在問題,當我厭倦它沒有這個聲明程序正常工作 –

+0

所以我需要一個替代寫入共享內存 –