如何通过COPYDATASTRUCT发送VARIANT_bstr

时间:2010-01-09 04:42:56

标签: variant

我需要使用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时发生。 :(

谢谢

1 个答案:

答案 0 :(得分:0)

WM_COPYDATA将与其他应用程序共享您的数据结构(由lpData引用的数据结构)。数据结构中包含的任何内容都可由其他应用程序访问。但是,bstrVal是一个引用应用程序内存的指针,当另一个应用程序尝试引用它时,它将失败。

这是一个解决方案;它确实需要双方额外的工作。

在发件人方面,当您分配数据结构(structMessage)时,请添加足够的额外空间来保存字符串。将字符串附加到数据结构的末尾(并确保以适当的大小增加dwData)。

在接收方,您可以检索字符串并在此时使用SysAllocString调用来分配bstrVal。完成后别忘了打电话给SysFree。