【问题标题】:SendMessage to 64bit application is not workingSendMessage 到 64 位应用程序不起作用
【发布时间】:2017-05-06 05:44:45
【问题描述】:

我使用以下函数向应用程序发送消息。它似乎适用于 32 位应用程序,但不适用于 64 位应用程序(64 位应用程序似乎没有收到任何消息)。出了什么问题,我该如何解决?谢谢。

void MyTest::SendCmd(HWND hwnd, QString cmd)
{
COPYDATASTRUCT data;
data.dwData = FIXHEADER;
data.cbData = cmd.size()+1;
data.lpData = cmd.toLocal8Bit().data();

LPARAM lpdwResult;
LRESULT err = SendMessageTimeout(hwnd, WM_COPYDATA, 0, (LPARAM)&data, SMTO_ABORTIFHUNG, 2000, &lpdwResult); 
}
//FIXHEADER is a fixed hex value that the application checks against to make sure the message is sent intentional for it.

【问题讨论】:

  • 您是否尝试将消息发送到另一个进程的窗口句柄?
  • 是的。消息从我的程序发送到另一个应用程序(32 位或 64 位)。另一个应用程序由 windows 句柄指定。 windows是win 7 64位。
  • 这可能会有所帮助:您是否注意到SendMessageTimeout() 实际上是一个扩展为SendMessageTimeoutW()SendMessageTimeoutA() 的宏。 (“W”代表宽字符,即 Unicode,“A”代表 ANSI)它扩展的对象是 defined(在 C 的意义上),并且取决于 VS 设置的某些属性。但是,参数的类型也可能取决于此。
  • 这行不通,我想。其他应用程序只接收wparamlparam 的值; SendMessageTimeout不知道lparam其实是一个指针,还有更多的数据要传输。
  • 发布的代码在目标应用程序是 32 位应用程序时有效,但如果目标应用程序是 64 位应用程序则无效。我尝试了 SendMessageTimeoutW() 和 SendMessageTimeoutA() 但也没有任何效果......还有其他想法吗?谢谢。

标签: c++ sendmessage


【解决方案1】:

您需要在 64 位模式下编译您的应用程序,否则这将无法工作,并且 64 位句柄会被截断,使其无效。

给你一些阅读: https://docs.microsoft.com/en-us/windows/desktop/winauto/32-bit-and-64-bit-interoperability

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多