消息作用:
在進程間共享數據(內部通過創建內存映射文件)
消息介紹:
需要用到的數據結構/類型:
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);
注意:如果要發送的是一個CString類型的字符串,那麼可以這麼做
CString str = _T("女孩不哭"); char* msg = str.GetBuffer(0);
這樣就可以轉化為 char*類型了
--------------------------------------------
接收端對該消息的一種可能處理:
BOOL CxuanzeDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 COPYDATASTRUCT* pCDS = (COPYDATASTRUCT*)pCopyDataStruct; CString str((char*)pCDS->lpData); str.Format(_T("%s 標志:%d"), str, pCDS->dwData); AfxMessageBox(str); return CDialogEx::OnCopyData(pWnd, pCopyDataStruct); }
說明:
使用 WM_COPYDATA 消息的傳遞數據,其實是將要傳遞的數據復制到共享內存中去後,將地址傳遞給另一個進程.
在這個消息中,有一個標志dwData 這個數據是一個ULONG_PTR類型,無符號長整數,可以用作數據的標志.這樣不同的標志,可以將傳遞的數據用作不同的用途!