C++ MFC深入詳解之---- 實現進程間通信(WM_COPYDATA)

首先你要知道:

消息WM_COPYDATA的作用爲:

當應用程序將數據傳遞到另一個應用程序時,將發送此消息。

句法:

WM_COPYDATA wParam = (WPARAM)(HWND) hwnd; 
    lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;

參數:

  • hwnd
    處理傳遞數據的窗口。
  • pcds
    指向包含要傳遞的數據的COPYDATASTRUCT結構的指針。

返回值:

如果接收方應用程序處理了此消息,則應返回TRUE;否則,返回TRUE。否則,應返回FALSE。

注意:

應用程序必須使用SendMessage函數發送此消息,而不是PostMessage函數。

傳遞的數據不得包含指向接收數據的應用程序不可訪問的對象的指針或其他引用。

發送此消息時,發送過程的另一個線程不得更改引用的數據。

接收應用程序應將數據視爲只讀。在個人通訊裝置參數僅該消息的處理過程中是有效的。接收應用程序不應釋放pcds引用的內存。如果接收應用程序必須在SendMessage返回後訪問數據,則必須將數據複製到本地緩衝區中

其中COPYDATASTRUCT的結構

typedef struct tagCOPYDATASTRUCT {
  ULONG_PTR dwData;
  DWORD     cbData;
  PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

 

dwData

類型:ULONG_PTR

要傳遞給接收應用程序的數據。

cbData

類型:DWORD

lpData成員指向的數據的大小(以字節爲單位)。

lpData

類型:PVOID

要傳遞給接收應用程序的數據。該成員可以爲NULL

 

一個例子:

首先我是在第一個應用程序中拖拽了一個Edit和一個Button控件,實現在文本編輯框內輸入字符串,點擊按鈕發送到另一個應用程序的對話框內(第一個應用程序叫mfctest1,第二個叫mfctest2)

在mfctest1中實現:

其中Edit的ID爲IDC_SENDSTR

按鈕的響應函數內代碼:

LRESULT copyData;  //copyDataResult has value returned by other app 
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "mfctest2");

CString strData;
GetDlgItemText(IDC_SENDSTR,strData);
if (pOtherWnd)
{
    COPYDATASTRUCT cpd;   //上面提到的結構體
    cpd.dwData = 0;
    cpd.cbData = strData.GetLength()+sizeof(wchar_t);        //sizeof(wchar_t)指 \0 的長度。     
    cpd.lpData = (void*)strData.GetBuffer(cpd.cbData);             
    copyData= pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
    strData.ReleaseBuffer();
}
else 
{
    AfxMessageBox("未找到");
}

 

在mfctest2中實現:

拖拽一個Edit編輯框,ID爲:IDC_RecvStr;

先給窗口添加WM_COPYDATA消息函數,然後在函數中添加成如下:

在VC++6.0中是右擊CMfctest2Dlg(我這裏的窗口名叫“mfctest2”),再點擊ADD Windows Message Handler...,找到WM_COPYDATA消息,添加。

在VS中是右擊CMfctest2Dlg點擊屬性,上面有一個消息的圖標,點擊,找到WM_COPYDATA,add

函數實現:

BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    // TODO: 在此添加消息處理程序代碼和/或調用默認值

    CString strRec = (LPCSTR) (pCopyDataStruct->lpData);
    SetDlgItemText(IDC_RecvStr,strRec);


    return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

全部編譯完成,並運行(注意兩個程序都要運行,不然找不到接受方的對話框)

在mfctest1的編輯框中輸入“123456789”,點擊發送

“123456789”出現在mfctest2的編輯框中

成功!

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