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

时间:2016-10-30 20:45:42

标签: c++ winapi sendmessage wm-copydata

我使用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;

1 个答案:

答案 0 :(得分:0)

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

另一方面,ReplyMessage没有进行此类复制,只返回发件人数据的(重新解释)地址。
这不是接收端的有效地址。

如果您想来回传递数据,则需要在两个方向都使用SendMessageWM_COPYDATA,可能会在顶部添加您自己的协议。