Visual c++ 将WM_COPYDATA消息从VC发送到BCB:失败,但从BCB发送到BCB:通过

Visual c++ 将WM_COPYDATA消息从VC发送到BCB:失败,但从BCB发送到BCB:通过,visual-c++,c++builder,sendmessage,Visual C++,C++builder,Sendmessage,我不明白为什么从VC++应用程序(主应用程序)向BCB应用程序(从应用程序)发送WM_COPYDATA会失败,但从BCB应用程序(主应用程序)向BCB应用程序(从应用程序)发送会失败。我已经在BCB和VC++中验证了调试模式下的HWND,它们都是相同的值(0x00030BEE) 下面是我的代码,非常简单 VC主机(.cpp)(32位) BCB主机(.cpp)(32位) VC++和BCB之间唯一的区别是GetSafeHwnd()和Application->Handle。调用FindWindow()

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

下面是我的代码,非常简单

VC主机(.cpp)(32位)

BCB主机(.cpp)(32位)

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

BCB从机(.h)(32位)

BCB从机(.cpp)

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

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

环境:Win7,专业版,64位


< /P> < P>从Remy Lebeau评论中,改变Visual C++设置或调用CeaEnWoWeMaseFieldEx可以解决这个问题。


传递
WM_COPYDATA
时不需要
WPARAM
值,这只是为了方便接收方在需要时向发送方发送回复。您在
WPARAM
中传递的内容在您的示例中是不相关的,因为您的从机不使用它。因此,唯一可能的区别是
COPYDATASTRUCT
struct或
SendMessage()
本身。确保两个编译器中的
COPYDATASTRUCT
大小和对齐方式相同。并检查
SendMessage()
的返回值,确保它没有失败。例如,也许UIPI阻止了VC应用程序,但没有阻止BCB应用程序。@RemyLebeau真的很感谢!,它被UIPI阻止,我将vc设置(UAC执行级别)更改为high,并通过。谢谢或者,您可以更新从机的代码,以明确允许从较低完整性进程向其发送
WM_COPYDATA
消息,例如:
void\uu fastcall TForm1::CreateWnd(){TForm::CreateWnd();::ChangeWindowMessageFilterEx(Handle,WM_COPYDATA,MSGFLT_allow,NULL)}
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);
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);
void __fastcall OnCopyData(TMessage &Msg);
BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_COPYDATA,TMessage, OnCopyData)
END_MESSAGE_MAP(TForm)
void __fastcall TForm1::OnCopyData(TMessage &Msg)
{
    ::OutputDebugString("123");
}