2016-10-10 185 views
-2

我想在兩個進程之間創建一個共享內存。因此,我簡單地複製從Microsoft頁面的剪斷:無法映射共享內存

片段1:

#define BUF_SIZE 256 
TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[] = TEXT("Message from first process."); 

void initSharedMem() { 
HANDLE hMapFile; 
LPCTSTR pBuf; 

hMapFile = CreateFileMapping(
    INVALID_HANDLE_VALUE, // use paging file 
    NULL,     // default security 
    PAGE_READWRITE,   // read/write access 
    0,      // maximum object size (high-order DWORD) 
    BUF_SIZE,    // maximum object size (low-order DWORD) 
    szName);     // name of mapping object 

if (hMapFile == NULL) { 
    MessageBox(0, "Could not create file mapping object", "Error", 0); 
    return; 
} 
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, 
    0, 
    BUF_SIZE); 

if (pBuf == NULL) { 
    MessageBox(0, "Could not map view of file", "Error", 0); 
    CloseHandle(hMapFile); 

    return; 
} 


CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
_getch(); 

UnmapViewOfFile(pBuf); 

CloseHandle(hMapFile); 

MessageBox(0, "Done init shared mem", "Done", 0); 
return; 
} 

片段2(其他工序):

#define BUF_SIZE 256 
TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[] = TEXT("Message from first process."); 

void readSharedMem() { 
HANDLE hMapFile; 
LPCTSTR pBuf; 

hMapFile = OpenFileMapping(
    FILE_MAP_ALL_ACCESS, // read/write access 
    FALSE,     // do not inherit the name 
    szName);    // name of mapping object 

if (hMapFile == NULL) { 
    MessageBox(0, L"Error", L"Could not open file mapping object", 0); 
    return; 
} 

pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, 
    0, 
    BUF_SIZE); 

if (pBuf == NULL) { 
    MessageBox(0, L"Error", L"Could not map file", 0); 

    CloseHandle(hMapFile); 

    return; 
} 

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); 

UnmapViewOfFile(pBuf); 

CloseHandle(hMapFile); 

return; 

MessageBox(0, L"Done", L"SharedMemoryDone", 0); 
} 

我調用過程A中的第一功能,並獲得完成的消息。但是當我之後調用readSharedMem函數時,我收到錯誤消息「無法打開文件映射對象」。

我在這裏做錯了什麼?

+0

當您嘗試打開共享內存部分時,您的進程仍然活着嗎?此外,當'OpenFileMapping'失敗時,你會得到什麼樣的錯誤代碼? – IInspectable

+1

提示:永遠不要複製/粘貼代碼。理想情況下,您應該重新輸入代碼,查找您不瞭解的任何內容。這就是你學習新概念的方法。 – CodeMouse92

+0

是的,兩者都還活着,錯誤代碼是2. – QDA

回答

1

我在過程A中調用第一個函數,並獲取完成的消息。

到完成消息出現時,文件映射對象已經關閉,因此它不再存在。

但是當我以後調用readSharedMem函數時,出現錯誤消息「無法打開文件映射對象」。

你已經太晚了!您需要在文件映射對象仍然存在時打開它。這大概是在第一個片段中致電_getch的原因;你應該在那個點上運行另一個程序,然後再打開一個鍵繼續。

+0

是的,就是這樣,我在睡覺之前也一樣。我現在試了一下,出現了帶有「Process2」的messageBox,但現在還有另一個問題。在消息框中有一些中文字母,而不是「來自第一個進程的消息」。他們爲什麼解釋錯了? – QDA

+0

也許你一直在搞亂Unicode設置,因爲之前的一些評論建議他們可能是你的問題。 (爲了記錄,您應該*始終*使用Unicode模式。) –