Visual c++ 将WM_COPYDATA消息从VC发送到BCB:失败,但从BCB发送到BCB:通过
我不明白为什么从VC++应用程序(主应用程序)向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()
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(©data, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)©data);
char ss[] = "1234";
HWND hwnd = ::FindWindow(NULL, "12345678");//12345678 = Slave Window
COPYDATASTRUCT copydata;
memset(©data, 0, sizeof(copydata));
copydata.dwData = 0;
copydata.cbData = strlen(ss);
copydata.lpData = ss;
::SendMessage(hwnd, WM_COPYDATA, (WPARAM)Application->Handle, (LPARAM)©data);
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");
}