电竞比分网-中国电竞赛事及体育赛事平台

分享

使用 WM_COPYDATA 在進程間共享數(shù)據(jù)

 tianht 2015-06-10
轉(zhuǎn):http://www.cnblogs.com/nbsofer/archive/2012/09/11/2680980.html

消息作用:
    在進程間共享數(shù)據(jù)(內(nèi)部通過創(chuàng)建內(nèi)存映射文件)

消息介紹:
需要用到的數(shù)據(jù)結(jié)構(gòu)/類型:
typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;
    PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

結(jié)構(gòu)體參數(shù)說明:
    dwData(ULONG)   保存一個數(shù)值, 可以用來作標志等
    lpData(void*)   待發(fā)送的數(shù)據(jù)的起始地址(可以為NULL)
    cbData(DWORD)   待發(fā)送的數(shù)據(jù)的長度
    
消息的參數(shù):
    hWnd:   接收數(shù)據(jù)的窗口的句柄
    wParam: 傳送該數(shù)據(jù)的窗口句柄(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' 結(jié)尾的字符串
        COPYDATASTRUCT* pCDS = (COPYDATASTRUCT*)lParam;
        MessageBox(hWnd, pCDS->lpData, "", MB_OK);
        return TRUE;
    }
    
說明:  
    發(fā)送的數(shù)據(jù)可以是任意的, 我上面只是為了用MessageBox做測試, 所以發(fā)送的是以'\0'的字符串.
    如果接收消息的應用程序處理了該消息, 它應該返回 TRUE , 否則返回 FALSE. lpData 指向的內(nèi)存應該是一段"數(shù)據(jù)", 就是說里面不應該有指向該程序某數(shù)據(jù)的指針. 因為 SendMessage 在處理 WM_COPYDATA 時, 只是把 lpData 指向的 cbData 個字節(jié)復制到共享內(nèi)存中. 當前進程私有的指針就算是被發(fā)送到接收程序, 其也是無法訪問的. 當該消息正當發(fā)送時, 該進程的其它線程不能修改其中的數(shù)據(jù). 接收端應用程序應該把這段共享內(nèi)存作為只讀內(nèi)存來訪問. 請不要嘗試修改其中的內(nèi)容. lParam 指向的數(shù)據(jù)只有在該消息處理時有效, 消息返回后無效(共享內(nèi)存已被釋放). 且接收端也不能釋放該內(nèi)存. 如果要在消息返回后繼續(xù)取得數(shù)據(jù), 可以把它復制到當前進程的某個位置.
復制代碼

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


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多