2016-10-10 183 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模式。) –