我使用Microsoft RPC
,我需要转移包含std::wstring
和boost::ptime
类型字段的自定义结构。在idl
中没有这样的数据类型。发送该结构的最佳解决方案是什么。在阅读有关使用RPC
的序列化时。但ms序列化也基于idl
文件,因此我无法使用idl
和wstring
在ptime
文件中定义struct。
答案 0 :(得分:4)
IDL具有一组有限的基本类型,并且它不能传输完整的c ++对象,因为接收器可能根本不用c ++编写。所以,你必须做一些转换,但是你提到的类型并不是很复杂。
从wstring开始,以下是您的选择:
[in, string] wchar_t*
传递。 wchar_t*
是您拨打std::wstring.c_str()
时获得的,因此您可以轻松调用界面而无需进一步转换。BSTR
不是基本IDL的一部分,而是一个在COM中广泛使用的OLE自动化扩展。使用它可能需要additional configuration。 BSTR
基本上是wchar_t*
,但其大小位于缓冲区的开头。您可以使用BSTR
创建AllocSysString
并使用SysFreeString
释放它。或者,您可以使用ATL的CComBSTR或_bstr_t类来管理BSTRings。两者都在其构造函数中接受wchar_t*
,因此转换wstring
不会有问题。现在,至于ptime
,我对这种类型并不熟悉,所以可能有其他选择,但我能找到这两个:
ptime
to an int64,然后使用IDL的__int64类型传递其值。to_iso_string
将ptime
转换为字符串,然后按照上面的建议传递(请注意,to_iso_string
会定期std::string
而不是std::wstring
})。另一方面,使用from_iso_string
来获取ptime
。答案 1 :(得分:0)
您还可以使用VARIANT类型,它根据传递的数据类型为您提供一堆选项。在您的情况下,它将是VT_BSTR&类型的VARIANT。 VT_DATE。
这对我来说很有用,因为我可以传递SAFEARRAY,我可以用它来传递STL类型,比如std :: map。
关于以上MSDN网站的注意事项:在IDL中添加VARIANT类型时,上述链接提到导入" objidl.idl"。这仍然给了我一个编译错误,而是导入" oaidl.idl"为我工作。