【问题标题】:Send wstring and ptime over MS RPC通过 MS RPC 发送 wstring 和 ptime
【发布时间】:2011-12-08 18:33:33
【问题描述】:

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

【问题讨论】:

  • 我猜想把 wstring 变成 BSTR。不确定 ptime,但我想它是幕后的某种整数。

标签: c++ winapi rpc idl


【解决方案1】:

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 的一部分,而是一个 OLE 自动化扩展,在 COM 中广泛使用。使用它可能需要additional configurationBSTR 基本上是 wchar_t*,但它的大小位于缓冲区的开头。您可以使用AllocSysString 创建BSTR 并使用SysFreeString 释放它。或者,您可以使用 ATL 的 CComBSTR_bstr_t 类来管理 BSTRing。两者都在其构造函数中接受 wchar_t*,因此转换 wstring 不会有问题。

现在,至于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

【讨论】:

  • 您如何看待使用 boost::serialization 进行序列化并作为字节数组发送?
  • @userbb,我对 boost::serialization 知之甚少,但是发送一个字节数组绝对是一种合理的可能性(而且实现起来并不难)。如果您要处理的只是这两个参数,那么序列化可能会增加开销,并使传递的内容更难调试(作为字节数组),但这对您来说可能不是真正的问题。
【解决方案2】:

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

这对我个人来说效果很好,因为我可以传递 SAFEARRAYs,我可以用它来传递像 std::map 这样的 STL 类型。

Marshaling OLE Data Types:

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

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2011-08-02
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多