程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++ 在兩個程序中 傳遞字符串等常量值的方法:使用了 WM_COPYDATA 消息的,vcwm_copydata

VC++ 在兩個程序中 傳遞字符串等常量值的方法:使用了 WM_COPYDATA 消息的,vcwm_copydata

編輯:C++入門知識

VC++ 在兩個程序中 傳遞字符串等常量值的方法:使用了 WM_COPYDATA 消息的,vcwm_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);

注意:如果要發送的是一個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類型,無符號長整數,可以用作數據的標志.這樣不同的標志,可以將傳遞的數據用作不同的用途!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved