进程间通讯及数据共享

今天看到几个关于共享内存的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 实现进程间数据共享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章