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

Posted

技术标签:

【中文标题】如何将 LRESULT 转换为自定义结构类型?【英文标题】:How to cast a LRESULT to a custom struct type? 【发布时间】:2016-10-30 20:45:42 【问题描述】:

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

【问题讨论】:

SendMessage() 在使用 WM_COPYDATA 时返回 TRUE 或 FALSE。为什么你认为你可以把返回值当作一个指针来对待是很难猜到的。 msdn.microsoft.com/en-us/library/windows/desktop/… ,检查这个链接,它说返回值为LRESULT @molbdnilo 我知道我无法在应用程序之间传递地址。但是,即使我不使用 new,使用复制构造函数,我仍然无法成功转换它。我都试过了,我只在这个问题中发布了其中一个 Use WM_COPYDATA to send data between processes的可能重复 如果您在理解文档方面继续失败,那么事情对您将不起作用。如果您认为您不需要知道自己在做什么,using data copy 提供了一个完整的示例实现。 (如果您想知道,否决票是由于缺乏研究。) 【参考方案1】:

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

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

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

【讨论】:

以上是关于如何将 LRESULT 转换为自定义结构类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 json 转换为自适应卡片 json 格式

如何将时间字符串转换为自定义日期格式?

将 DataSnapshot 转换为自定义结构对象 - Swift 4

将表转换为自定义类型数组

R语言将连续数值转换为自定义间隔的离散类型数据(分类型标称型)实战: 自定义间隔的数据分箱

将字符串转换为自定义<字符串>