2

我需要使用 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 相关。:(

谢谢你

4

1 回答 1

0

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

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

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

在接收方,您可以检索字符串并在此时使用 SysAllocString 调用来分配 bstrVal。完成后不要忘记调用 SysFree。

于 2010-01-09T06:15:19.927 回答