【问题标题】:SendMessage WM_COPYDATA msg From VC to BCB : Fail, but BCB to BCB : PassSendMessage WM_COPYDATA msg 从 VC 到 BCB:失败,但 BCB 到 BCB:通过
【发布时间】:2020-02-10 06:44:28
【问题描述】:

我不明白为什么将WM_COPYDATA 从 VC++ 应用程序(主)发送到 BCB 应用程序(从属)失败,但从 BCB 应用程序(主)发送到 BCB 应用程序(从属)通过。我已经在 BCB 和 VC++ 的调试模式下验证了 HWND,它们都是相同的值(0x00030BEE)。

以下是我的代码,很简单

VC 主控 (.cpp)(32 位)

char ss[] = "1234";
HWND hwnd = ::FindWindowA(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(&copydata, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&copydata);

BCB 主控 (.cpp)(32 位)

char ss[] = "1234";
HWND hwnd = ::FindWindow(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(&copydata, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
::SendMessage(hwnd, WM_COPYDATA, (WPARAM)Application->Handle, (LPARAM)&copydata);

VC++ 和 BCB 之间的唯一区别是 GetSafeHwnd()Application->Handle。调用FindWindow()后,VC++和BCB中的HWND值相同(0x00030BEE)。

BCB 从站(.h)(32 位)

void __fastcall OnCopyData(TMessage &Msg);
BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_COPYDATA,TMessage, OnCopyData)
END_MESSAGE_MAP(TForm)

BCB 从站(.cpp)

void __fastcall TForm1::OnCopyData(TMessage &Msg)
{
    ::OutputDebugString("123");
}

BCB 从机可以从 BCB 主机获取消息,并输出 123 消息。但它无法从 VC++ master 获取消息。

我很困惑。有谁知道如何解决这个问题?

环境:Win7,专业,64位

【问题讨论】:

  • WPARAM 值不是传递WM_COPYDATA 所必需的,这只是为了方便接收者在需要时将回复发送回发送者。您在 WPARAM 中传递的内容与您的示例无关,因为您的奴隶不使用它。因此,唯一可能的区别是 COPYDATASTRUCT 结构或 SendMessage() 本身。确保COPYDATASTRUCT 在两个编译器中的大小和对齐方式相同。并检查SendMessage() 的返回值,确保它没有失败。例如,也许 UIPI 阻止了 VC 应用,但没有阻止 BCB 应用。
  • @RemyLebeau 真的很感谢!它被 UIPI 阻止了,我将 vc 设置(UAC 执行级别)更改为高,然后通过。谢谢!
  • 或者,您可以改为更新从属的代码以明确允许从低完整性进程向其发送WM_COPYDATA 消息,例如:void __fastcall TForm1::CreateWnd() { TForm::CreateWnd(); ::ChangeWindowMessageFilterEx(Handle, WM_COPYDATA, MSGFLT_ALLOW, NULL); }

标签: visual-c++ c++builder sendmessage


【解决方案1】:

根据 Remy Lebeau 的评论,更改 Visual c++ 设置或调用 ChangeWindowMessageFilterEx 可以解决此问题。

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多