今天看到几个关于共享内存的BLOG,感觉写的不错。而之前又弄了几天这个问题,于是说一下自己当时的处理办法。
由于当时没有细看MSDN上WM_COPYDATA 的处理,于是选择了另一种办法。而其实,当时老大的意思也是用WM_COPYDATA。
直接在另一个进程中进行数据分配:
VirtualAllocEx()
void ceDesktopxCore::postIPCMsg(HWND hwnd, const char *topic, const nsAString & someData)
{
nsString sWData(someData);
LPVOID ipRemoteBuffer = NULL;
DWORD processId = 0;
DWORD threadId = ::GetWindowThreadProcessId(hwnd, &processId);
HANDLE hProcess = ::OpenProcess( PROCESS_ALL_ACCESS, FALSE, processId);
ipRemoteBuffer = ::VirtualAllocEx(
hProcess,
NULL,
strlen(topic),
MEM_COMMIT,
PAGE_READWRITE );
DWORD iWrite;
WriteProcessMemory(
hProcess,
ipRemoteBuffer,
topic,
strlen(topic),
&iWrite
);
LPVOID ipRemoteBuffer2 = NULL;
ipRemoteBuffer2 = ::VirtualAllocEx(
hProcess,
NULL,
2*someData.Length(),
MEM_COMMIT,
PAGE_READWRITE );
//DWORD iWrite;
WriteProcessMemory(
hProcess,
ipRemoteBuffer2,
sWData.get(),
2*someData.Length(),
&iWrite
);
::PostMessage(hwnd, WM_CE_NOTIFY, (WPARAM)ipRemoteBuffer, (LPARAM)ipRemoteBuffer2);
::CloseHandle( hProcess );
return;
}
参考:
时隔已久,当时也参考了好几个网上的文档,由于时间仓促没有记下,下回找到后一定补齐。
相关BLOG:
http://blog.csdn.net/flywithdream/archive/2007/06/14/1652491.aspx
WM_COPYDATA 实现进程间数据共享