SendMessage跨進程通信

使用SendMessage 和PostMessage 出現的坑。。。

#include <iostream>
#include <Windows.h>
#include <string>
#include <memory>
using namespace std;
typedef struct tagMYREC
{
    char  s1[80];
    char  s2[80];
    DWORD n;
} MYREC;
MYREC MyRec;
int main()
{
    //COPYDATASTRUCT MyCDS;
    //MyCDS.dwData = 0;          // function identifier
    //MyCDS.cbData = sizeof(MyRec);  // size of data
    //MyCDS.lpData = &MyRec;           // data structure
    //MyRec.n = 99;
    //strcpy(MyRec.s1, "111");
    //strcpy(MyRec.s2, "222");
    HWND handle = FindWindow(NULL, L"windows windows");//用戶可能有替換窗口名的操作行爲
    int number = 11;
    const char a[100] = {"你好你好你好"};
    if (handle != NULL) {
        SendMessage(handle, WM_COPYDATA, number, (LPARAM)a);
    }
    cout << 1;
}

 

    case WM_COPYDATA: {
        //pMyCDS = (PCOPYDATASTRUCT)lParam;
        //char str1[100];
        //char str2[100];
        //DWORD a;
        //strcpy(str1, (LPSTR)((MYREC*)(pMyCDS->lpData))->s1);
        //strcpy(str2, (LPSTR)((MYREC*)(pMyCDS->lpData))->s2);
        //a = (DWORD)((MYREC*)(pMyCDS->lpData))->n;
        char str1[100];
        strcpy(str1, (LPSTR)lParam);
        break;
    }

在同一進程下, 使用自己定義的 是沒有問題的, 但是跨進程的時候, 消息要用

WM_COPYDATA  我是用自己定義的 WM_USER + 0x40  就傳遞不過去。。。。一直無訪問權限

 


WM_COPYDATA 消息是一種用於進程間通信(IPC)的機制,具有以下優點和一些限制:

優點:

  1. 簡單易用:使用 WM_COPYDATA 消息進行進程間通信相對簡單,無需引入複雜的IPC機制。

  2. 跨進程通信:WM_COPYDATA 消息允許在不同進程之間傳遞數據。通過指定目標窗口的句柄,可以向其他進程發送消息並傳遞數據。

  3. 數據複製:WM_COPYDATA 消息會在發送方和接收方之間自動進行數據複製。這樣,發送方可以安全地釋放或修改原始數據,而不會影響接收方對數據的訪問。

  4. 適用於任意數據:WM_COPYDATA 消息可以傳遞任意類型的數據,只要數據大小適合 COPYDATASTRUCT 結構的要求。

缺點:

  1. 數據大小限制:COPYDATASTRUCT 結構中的 cbData 字段有一個最大值限制,通常爲64KB。如果需要傳遞更大的數據,可能需要使用其他IPC機制。

  2. 同步通信:WM_COPYDATA 消息是同步的,發送方會阻塞直到接收方處理完消息。如果需要實現異步通信,可能需要使用其他機制。

  3. 進程安全性:使用 WM_COPYDATA 消息時,發送方和接收方必須具有相應的安全權限來進行跨進程通信。

綜上所述,WM_COPYDATA 消息是一種簡單且適用於進程間傳遞消息的方式,但也需要根據具體的需求和限制進行權衡和選擇。對於更復雜的進程間通信需求,可能需要考慮其他IPC機制,如管道、共享內存或消息隊列等。

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