【发布时间】:2015-08-26 17:57:07
【问题描述】:
我有两个 win32 程序,它们通过 IPC 与一个 DLL 通信。我使用 MSVC ++,所以使用 CreateFileMapping 和 MapViewOfFile 是有意义的。我已经完成了一些代码,问题是当我的第二个程序启动并加载一个 DLL 并开始使用 DLL 时,一切都很好,IPC 通信进展顺利。当第一个程序启动并加载一个 DLL 并开始使用 DLL 并且第二个程序启动并加载一个 DLL 并开始使用 DLL 时,第二个程序停止通过 IPC 与 DLL 通信。 IPC 通信可能正在运行,但可能以错误的方式运行。它获得了大小和容量,但内容是垃圾。共享内存的内容是指针向量!我究竟做错了什么?我需要知道什么才能让这些工作正常吗?
//The sender writer
MainWindow::~MainWindow()
{
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
void MainWindow::SetData(vector <SubWindow*> &iMainWin)
{
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(vector <SubWindow*>), TEXT("MyMappedMem"));
if (hMapFile == NULL)
return;
vector <SubWindow*> *pBuf = reinterpret_cast<std::vector<SubWindow*>*> (MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(vector <SubWindow*>)));
if (pBuf == NULL)
{
CloseHandle(hMapFile);
return;
}
memcpy(pBuf, &iMainWin, sizeof(iMainWin));
return;
}
//The reciever reader
void DataWork()
{
do{
if (strcmp(pe32.szExeFile, "Win32Project.exe") == 0)
{
bProcessFound = true;
break;
}
} while (Process32Next(hProcessSnap, &pe32));
if (!bProcessFound)
{
MessageBox(NULL, TEXT("ERROR Process32Next Openning DLL"), TEXT("ERROR"), MB_OK);
return;
}
else
{
HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("MyMappedMem"));
if (hMapFile == NULL)
{
MessageBox(NULL, TEXT("ERROR OpenFileMapping DLL"), TEXT("ERROR"), MB_OK);
return;
}
vector<SubWindow*> *pBuf = reinterpret_cast<std::vector<SubWindow*>*> (MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(vector <SubWindow*>)));
if (pBuf == NULL)
{
MessageBox(NULL, TEXT("ERROR MapViewOfFile DLL"), TEXT("ERROR"), MB_OK);
CloseHandle(hMapFile);
return;
}
for (int i = 0; i < buf->size(); i++)
(*buf)[i]->value_access;
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}
}
【问题讨论】:
-
完全错了。向量的 sizeof 与该向量内的数据大小不同。尝试输出 100 个整数的向量的 sizeof。大概有 20 个字节,明白吗?你需要改变你在内存中保存数据的方式
-
文件映射可能是错误的解决方案。你为什么要解决这个问题?