1. 程式人生 > 其它 >[Windows程序間通訊]拷貝資料 WM_COPYDATA

[Windows程序間通訊]拷貝資料 WM_COPYDATA

使用WM_COPYDATA進行程序間通訊必須依賴Windows的訊息機制,不過此方法可以傳輸大量資料,而且實現簡單。

以下示例修改自Windows官方文件。

首先建立2個Windows桌面程式,為了示例的簡單,將字元型別修改為多位元組(預設為unicode)。

傳送端:

#define MYDISPLAY 1
typedef struct tagMyRec {
    char s1[64];
    char s2[64];
    DWORD n;
} MYREC;

VOID CopyData(HWND hWnd) {

    COPYDATASTRUCT myCDS = {0};
    MYREC myRec 
= {0}; // Put data into data structure auto hResult = StringCbCopy(myRec.s1, sizeof(myRec.s1), "Claude"); if (hResult != S_OK) { return ; } hResult = StringCbCopy(myRec.s2, sizeof(myRec.s2), "Bell"); if (hResult != S_OK) { return ; } myRec.n = 99;
// Fill COPYDATA structure myCDS.dwData = MYDISPLAY; myCDS.cbData = sizeof(myRec); myCDS.lpData = &myRec; auto hwDispatch = FindWindow("RECEIVER", "r"); if (hwDispatch != NULL) { SendMessage(hwDispatch, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)(LPVOID)
&myCDS); } else { MessageBox(hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK); } } //////////////////////// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: //DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); CopyData(hWnd);

出於示例的簡化目的,直接使用IDM_ABOUT觸發拷貝資料訊息.

接收端:

#define MYDISPLAY 1
typedef struct tagMyRec {
    char s1[64];
    char s2[64];
    DWORD n;
} MYREC;

VOID HandleCopyData(HWND hWnd, WPARAM wparam, LPARAM lparam) {
    auto pCDS = (PCOPYDATASTRUCT)lparam;
    switch (pCDS->dwData) {
    case MYDISPLAY: {
        auto myRec = (MYREC*)pCDS->lpData;
        MessageBox(hWnd, myRec->s1, myRec->s2, MB_OK);
        break;
    }
    }
}

///////////////////////////////

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COPYDATA:
        HandleCopyData(hWnd, wParam, lParam);
        break;

接收端只要在訊息處理函式中直接收一下資料就行了。