β

C++ 中的封送处理概述

姚广远的博客 192 阅读

https://msdn.microsoft.com/zh-cn/library/bb384865.aspx

在混合模式中,您有时会需要封送在本机和托管类型之间的数据。 Visual Studio 2008 引入一种简单的封送处理库方法来封送处理库,帮助您封送和转换数据。

可以使用封送处理库用或不用 marshal_context 类 。 这些转换需要上下文。 其他变换的实现,可以使用 函数 marshal_as 。 下表列出了支持的当前转换,它们是否需要上下文,以及送文件必须包括:

从类型 到<目标类型> 封送方法 包含文件<include>1
System::String^ const char * marshal_context marshal.h
const char * System::String^ marshal_as marshal.h
char * System::String^ marshal_as marshal.h
System::String^ const wchar_t* marshal_context marshal.h
const wchar_t * System::String^ marshal_as marshal.h
wchar_t * System::String^ marshal_as marshal.h
系统::IntPtr。 HANDLE marshal_as marshal_windows.h
HANDLE 系统::IntPtr。 marshal_as marshal_windows.h
System::String^ BSTR marshal_context marshal_windows.h
BSTR System::String^ marshal_as marshal.h
System::String^ bstr_t marshal_as marshal_windows.h
bstr_t System::String^ marshal_as marshal_windows.h
System::String^ std::string marshal_as marshal_cppstd.h
std::string System::String^ marshal_as marshal_cppstd.h
System::String^ std::wstring marshal_as marshal_cppstd.h
std::wstring System::String^ marshal_as marshal_cppstd.h
System::String^ CStringTchar<> marshal_as marshal_atl.h
CStringTchar<> System::String^ marshal_as marshal_atl.h
System::String^ CStringT<wchar_t> marshal_as marshal_atl.h
CStringT<wchar_t> System::String^ marshal_as marshal_atl.h
System::String^ CComBSTR marshal_as marshal_atl.h
CComBSTR System::String^ marshal_as marshal_atl.h

只有当您从托管代码封送到本机数据类型时和转换的本机类型没有自动的析构函数清理时才需要上下文。 封送处理上下文会销毁在析构函数中分配的本机数据类型。 因此,转换需要的上下文将是有效的,直至上下文被删除。 若要保存任何封送的值,必须将值复制到您的变量。

说明 说明
如果将 NULLs 封送到字符串中,则该字符串的结果得不到保证。 嵌入 NULLs 可能会导致该字符串被截断或保留。

封送处理库标头文件位于 msclr 子目录的 include 目录中。 此示例展示了如何引用在标头声明 msclr 内容:

#include “msclr\marshal_cppstd.h”

封送处理库是可扩展的,因此您可以自己添加封送的类型。 有关扩展封送库的详细信息,请参见 如何:扩展封送处理库

在早期版本中,封送数据可以使用 平台调用 。 有关 PInvoke 的更多信息,请参见 从托管代码调用本机函数

转载请注明: 姚广远的博客 » C++ 中的封送处理概述

作者:姚广远的博客
心有多大世界就有多大
原文地址:C++ 中的封送处理概述, 感谢原作者分享。