使用 WM_COPYDATA 在進程間共享數據


消息作用:
    在進程間共享數據(內部通過創建內存映射文件)

消息介紹:
需要用到的數據結構/類型:
typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;
    PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

結構體參數說明:
    dwData(ULONG)   保存一個數值, 可以用來作標志等
    lpData(void*)   待發送的數據的起始地址(可以為NULL)
    cbData(DWORD)   待發送的數據的長度
    
消息的參數:
    hWnd:   接收數據的窗口的句柄
    wParam: 傳送該數據的窗口句柄(NULL也無所謂)
    lParam: COPYDATASTRUCT類型變量的地址
    
使用示例:
    COPYDATASTRUCT cds;
    char msg[] = "女孩不哭";
    cds.dwData = 0;
    cds.lpData = msg;
    cds.cbData = strlen(msg)+1; //字符串請記得把'\0'加上, 不然就錯了, 這里是ANSI字符串
    SendMessage(FindWindow("nbsg_class", NULL), WM_COPYDATA, 0, (LPARAM)&cds);
    
接收端對該消息的一種可能處理:
    case WM_COPYDATA:
    {
        //這里的消息應該是以 '\0' 結尾的字符串
        COPYDATASTRUCT* pCDS = (COPYDATASTRUCT*)lParam;
        MessageBox(hWnd, pCDS->lpData, "", MB_OK);
        return TRUE;
    }
    
說明:  
    發送的數據可以是任意的, 我上面只是為了用MessageBox做測試, 所以發送的是以'\0'的字符串.
    如果接收消息的應用程序處理了該消息, 它應該返回 TRUE , 否則返回 FALSE. lpData 指向的內存應該是一段"數據", 就是說里面不應該有指向該程序某數據的指針. 因為 SendMessage 在處理 WM_COPYDATA 時, 只是把 lpData 指向的 cbData 個字節復制到共享內存中. 當前進程私有的指針就算是被發送到接收程序, 其也是無法訪問的. 當該消息正當發送時, 該進程的其它線程不能修改其中的數據. 接收端應用程序應該把這段共享內存作為只讀內存來訪問. 請不要嘗試修改其中的內容. lParam 指向的數據只有在該消息處理時有效, 消息返回后無效(共享內存已被釋放). 且接收端也不能釋放該內存. 如果要在消息返回后繼續取得數據, 可以把它復制到當前進程的某個位置.

女孩不哭(QQ:191035066) @ 2012-09-11 23:25:31 @ http://www.cnblogs.com/nbsofer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM