通过MS RPC发送wstring和ptime
Send wstring and ptime over MS RPC
我使用Microsoft RPC
,我需要转移具有类型std::wstring
和boost::ptime
字段的自定义结构。在idl
中没有这样的数据类型。发送该结构体的最佳解决方案是什么。阅读RPC
的序列化。但是ms序列化也是基于idl
文件的,所以我不能用wstring
和ptime
在idl
文件中定义struct。
IDL有一组有限的基本类型,它不能传输完整的c++对象,因为接收者可能根本不是用c++编写的。因此,您必须进行一些转换,但使用您提到的类型进行转换并不十分复杂。
从wstring开始,这里是你的选项:
- 传递一个c字符串作为
[in, string] wchar_t*
。wchar_t*
是你调用std::wstring.c_str()
时得到的,所以你可以很容易地调用接口而不需要进一步的转换。 - 传递一个c字符串作为字符数组。没有真正的理由这样做,只是说这是可能的。
- 传递一个c字符串作为BSTR。现在,
BSTR
不是基本IDL的一部分,而是在COM中广泛使用的OLE自动化扩展。使用它可能需要额外的配置。BSTR
基本上是wchar_t*
,但其大小在缓冲区的开头。您可以使用AllocSysString
创建BSTR
,并使用SysFreeString
释放它。或者,您可以使用ATL的CComBSTR或_bstr_t类来管理bstring。它们都在构造函数中接受wchar_t*
,因此转换wstring
不会有问题。
现在,对于ptime
,我不是很熟悉这种类型,所以可能有其他的选择,但我能够找到这两个:
- 将
ptime
转换为int64,然后使用IDL的__int64类型传递其值。 - 使用
to_iso_string
将ptime
转换为字符串,并按照上面的建议传递(注意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"。
相关文章:
- Ctypes wstring通过引用传递
- Boost::posix_time::ptime舍入到给定的分钟数
- 在C++中将变量 wstring 分配给 Char 数组
- 将日语 wstring 转换为 std::string
- 使用 memcpy 将矢量数据复制到 wstring 的正确方法
- -fshort-wchar 和 std::wstring - 分段错误
- boost:如何在给定的ptime之前使当前线程休眠?
- 输出 c++ 窗口 wstring 日志在终端中正确
- 从 uint32_t 转换为 wchar_t 并存储在 wstring 中时出现访问冲突
- 如何将std::wstring转换为char const[]
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 找不到 std::wstring 中存在的wchar_t
- 将 char* argv[] 转换为 wstring
- 将 std::string 转换为具有特殊字符的 FString (TCHAR / wstring)
- 在 C++ 中将 utf8 wstring 转换为窗口中的字符串
- 使用 ReadProcessMemory() 将未知大小的字符数组或字符串读入 wstring 中
- 从字符的 ASCII 代码点到 wstring
- 将整数附加到 std::wstring 会给出错误
- boost库的哪一部分使cout能够打印wstring以及如何打印?
- 通过MS RPC发送wstring和ptime