SendMessage跨进程通信

发布时间 2023-06-08 10:49:21作者: 冰糖葫芦很乖

使用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机制,如管道、共享内存或消息队列等。