通过MS RPC发送wstring和ptime

时间:2011-10-16 15:26:17

标签: c++ winapi rpc idl

我使用Microsoft RPC,我需要转移包含std::wstringboost::ptime类型字段的自定义结构。在idl中没有这样的数据类型。发送该结构的最佳解决方案是什么。在阅读有关使用RPC的序列化时。但ms序列化也基于idl文件,因此我无法使用idlwstringptime文件中定义struct。

2 个答案:

答案 0 :(得分:4)

IDL具有一组有限的基本类型,并且它不能传输完整的c ++对象,因为接收器可能根本不用c ++编写。所以,你必须做一些转换,但是你提到的类型并不是很复杂。

从wstring开始,以下是您的选择:

  1. 将c字符串作为[in, string] wchar_t*传递。 wchar_t*是您拨打std::wstring.c_str()时获得的,因此您可以轻松调用界面而无需进一步转换。
  2. 传递c字符串as an array的字符。没有真正的理由去做,只是说这是可能的。
  3. 将c字符串作为BSTR传递。现在,BSTR不是基本IDL的一部分,而是一个在COM中广泛使用的OLE自动化扩展。使用它可能需要additional configurationBSTR基本上是wchar_t*,但其大小位于缓冲区的开头。您可以使用BSTR创建AllocSysString并使用SysFreeString释放它。或者,您可以使用ATL的CComBSTR_bstr_t类来管理BSTRings。两者都在其构造函数中接受wchar_t*,因此转换wstring不会有问题。
  4. 现在,至于ptime,我对这种类型并不熟悉,所以可能有其他选择,但我能找到这两个:

    1. Convert the ptime to an int64,然后使用IDL的__int64类型传递其值。
    2. 使用to_iso_stringptime转换为字符串,然后按照上面的建议传递(请注意,to_iso_string会定期std::string而不是std::wstring })。另一方面,使用from_iso_string来获取ptime

答案 1 :(得分:0)

您还可以使用VARIANT类型,它根据传递的数据类型为您提供一堆选项。在您的情况下,它将是VT_BSTR&类型的VARIANT。 VT_DATE。

这对我来说很有用,因为我可以传递SAFEARRAY,我可以用它来传递STL类型,比如std :: map。

Marshaling OLE Data Types:

关于以上MSDN网站的注意事项:在IDL中添加VARIANT类型时,上述链接提到导入" objidl.idl"。这仍然给了我一个编译错误,而是导入" oaidl.idl"为我工作。