今天看到幾個關於共享內存的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 實現進程間數據共享