通过MS RPC发送wstring和ptime

Send wstring and ptime over MS RPC

本文关键字:ptime wstring 发送 MS RPC 通过      更新时间:2023-10-16

我使用Microsoft RPC,我需要转移具有类型std::wstringboost::ptime字段的自定义结构。在idl中没有这样的数据类型。发送该结构体的最佳解决方案是什么。阅读RPC的序列化。但是ms序列化也是基于idl文件的,所以我不能用wstringptimeidl文件中定义struct。

IDL有一组有限的基本类型,它不能传输完整的c++对象,因为接收者可能根本不是用c++编写的。因此,您必须进行一些转换,但使用您提到的类型进行转换并不十分复杂。

从wstring开始,这里是你的选项:

  1. 传递一个c字符串作为[in, string] wchar_t*wchar_t*是你调用std::wstring.c_str()时得到的,所以你可以很容易地调用接口而不需要进一步的转换。
  2. 传递一个c字符串作为字符数组。没有真正的理由这样做,只是说这是可能的。
  3. 传递一个c字符串作为BSTR。现在,BSTR不是基本IDL的一部分,而是在COM中广泛使用的OLE自动化扩展。使用它可能需要额外的配置。BSTR基本上是wchar_t*,但其大小在缓冲区的开头。您可以使用AllocSysString创建BSTR,并使用SysFreeString释放它。或者,您可以使用ATL的CComBSTR或_bstr_t类来管理bstring。它们都在构造函数中接受wchar_t*,因此转换wstring不会有问题。

现在,对于ptime,我不是很熟悉这种类型,所以可能有其他的选择,但我能够找到这两个:

  1. ptime转换为int64,然后使用IDL的__int64类型传递其值。
  2. 使用to_iso_stringptime转换为字符串,并按照上面的建议传递(注意to_iso_string为您提供常规std::string而不是std::wstring)。在另一边,使用from_iso_string来获取ptime

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

这对我个人来说工作得很好,因为我可以传递SAFEARRAYs,我可以用它来传递STL类型,如std::map.

封送OLE数据类型:

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