我使用sendMessage
并replyMessage
在同一台笔记本电脑中的两个应用程序之间进行通信。在接收方,当它接收到来自发件人的消息时,它将回复一条消息。因此,在发件人过程中,它将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转换为我的自定义结构?
我只是尝试发送interger或float。有用。但是,如果我使用自定义struct MyStruct
,它将无法正常工作。我想这是因为LRESULT的大小比MyStruct
.RES要短。如何解决此问题?LRESULT的大小为4,int的大小也为4。
typedef struct msg{
int msgId;
char msgInfo[100];
}MyStruct;
发送时WM_COPYDATA
,数据本身将复制到接收过程中。
的接收者WM_COPYDATA
获得指向该副本的指针。
两端的地址不太可能相同,但是每个端都有指向其自己的数据副本的有效指针。
另一方面,ReplyMessage
不进行此类复制,而仅返回发送者数据的(重新解释的)地址。
这不是接收端上的有效地址。
如果你想传递数据来回,你需要使用SendMessage
用WM_COPYDATA
在两个方向上,有可能增加自己的协议之上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句