如何将 LRESULT 转换为自定义结构类型?

How to cast a LRESULT to a custom struct type?

我使用 sendMessagereplyMessage 在同一台笔记本电脑中的两个应用程序之间进行通信。在接收方,当它收到来自发送方的消息时,它会回复一条消息。所以在发件人进程中,它会将 MyStruct 转换为 LRESULT,将回复发送给发件人应用程序。我试着把它投回接收器端,它也有效。

    PCOPYDATASTRUCT result;
MyStruct* data;
LRESULT a;
MyStruct* t;
MyStruct* reply = new MyStruct;
switch (uMessageType)
{
case WM_COPYDATA:
    result = (PCOPYDATASTRUCT)addtionalData;
    data = (MyStruct*)result->lpData;

    reply->msgId = 10;
    strcpy_s(reply->msgInfo, 100, "test reply");
    a = reinterpret_cast<LRESULT>(reply);
    t = reinterpret_cast<MyStruct*>(a);//when cast the LRESULT data to MyStruct back here, it succeed

    ReplyMessage(reinterpret_cast<LRESULT>(reply));


    break;

但是,当我试图在发件人端将此 LRESULT 转换为 MyStruct 时,它失败了:

LRESULT result = SendMessage(test, WM_COPYDATA, (WPARAM)(HWND)hwndC, (LPARAM)(LPVOID)&data);
MyStruct* reply = (MyStruct*)result;//the value of reply is unreadable

如何在发送方将 LRESULT 转换为我的自定义结构?

我就是想顺便发个整数或者浮点数。有用。但是,如果我使用自定义结构 MyStruct,它将不起作用。我猜这是因为 LRESULT 的大小小于 MyStruct。如何解决这个问题? LRESULT的大小是4,int的大小也是4.

typedef struct msg{
int msgId;
char msgInfo[100];
}MyStruct;

当您发送 WM_COPYDATA 时,数据本身被复制到接收进程。
WM_COPYDATA 的接收者获得指向此副本的指针。
两端的地址不太可能相同,但每一端都有一个指向其自己的数据副本的有效指针。

另一方面,ReplyMessage 不进行此类复制,仅 returns 发送方数据的(重新解释的)地址。
这不是接收端的有效地址。

如果你想来回传递数据,你需要在两个方向上使用 SendMessageWM_COPYDATA,可能在上面添加你自己的协议。