我需要使用COPYDATASTRUCT将VARIANT值发送到另一个应用程序。这是我用来发送消息的结构。
struct {
int i_MsgId;
VARIANT variant_Value;
}Message;
在我的代码中,我初始化VARIANT以键入BSTR并按如下方式分配字符串。
Message structMessage;
VariantInit(&structMessage.variant_Value);
structMessage.var_Value.vt = VT_BSTR;
structMessage.variant_Value.bstrVal = ::SysAllocString(L"I am a happy BSTR");
然后我使用COPYDATASTRUCT发送它,如下所示。
COPYDATASTRUCT structCDS;
structCDS.cbData = sizeof(structMessage);
structCDS.dwData = 12;
structCDS.lpData = (LPVOID)(&structMessage);
::SendMessage(this->m_RemoteWindow,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&structCDS);
此消息成功接收到我的第二个应用程序,但是,当我将其转换回原始结构时,“bstrVal”表示错误的指针。
我正在努力解决这个错误,所以期待你的宝贵帮助。请注意,其他varinat类型(int,double)可以成功转换回来,并且此错误仅在bstr时发生。 :(
谢谢
答案 0 :(得分:0)
WM_COPYDATA将与其他应用程序共享您的数据结构(由lpData引用的数据结构)。数据结构中包含的任何内容都可由其他应用程序访问。但是,bstrVal是一个引用应用程序内存的指针,当另一个应用程序尝试引用它时,它将失败。
这是一个解决方案;它确实需要双方额外的工作。
在发件人方面,当您分配数据结构(structMessage)时,请添加足够的额外空间来保存字符串。将字符串附加到数据结构的末尾(并确保以适当的大小增加dwData)。
在接收方,您可以检索字符串并在此时使用SysAllocString调用来分配bstrVal。完成后别忘了打电话给SysFree。