System.String 和 System.StringBuilder 类都有相似的封送处理行为。它们之间的主要差异是字符串是不可变的,而 StringBuilder 缓冲区的内容则可以由被调用方更改并复制回调用方。
本主题提供下列有关封送字符串类型的信息:
· 类库中使用的字符串
· 定长字符串缓冲区
类库中使用的字符串
下表显示字符串数据类型被作为方法参数封送到非托管代码时的封送处理选项。MarshalAsAttribute 属性提供了若干个 UnmanagedType 枚举值,以便将字符串封送到 COM 接口。
枚举类型 | 非托管格式的说明 |
UnmanagedType.BStr(默认) | 具有预设长度和 Unicode 字符的 COM 样式的 BSTR。 |
UnmanagedType.LPStr | 指向 ANSI 字符的空终止数组的指针。 |
UnmanagedType.LPWStr | 指向 Unicode 字符的空终止数组的指针。 |
下面的示例显示 IStringWorker 接口中声明的字符串。
下面的示例显示在类型库中描述的对应接口。
interface IStringWorker : IDispatch { HRESULT PassString1([in] BSTR s); HRESULT PassString2([in] BSTR s); HRESULT PassString3([in] LPStr s); HRESULT PassString4([in] LPWStr s); HRESULT PassStringRef1([in, out] BSTR *s); HRESULT PassStringRef2([in, out] BSTR *s); HRESULT PassStringRef3([in, out] LPStr *s); HRESULT PassStringRef4([in, out] LPWStr *s); ); |
平台调用中使用的字符串
平台调用复制字符串参数,并从 .NET Framework 格式 (Unicode) 转换为平台非托管格式。字符串是不可变的,在调用返回时不会从非托管内存复制回托管内存。
下表列出了在字符串被作为对平台调用进行的调用的方法参数封送时的封送处理选项。MarshalAsAttribute 属性提供了若干个 UnmanagedType 枚举值以封送字符串。
枚举类型 | 非托管格式的说明 |
UnmanagedType.AnsiBStr | 具有预设长度并包含 ANSI 字符的 COM 样式 BSTR。 |
UnmanagedType.BStr(默认) | 具有预设长度和 Unicode 字符的 COM 样式的 BSTR。 |
UnmanagedType.LPStr | 指向 ANSI 字符的空终止数组的指针。 |
UnmanagedType.LPTStr | 指向平台相关的字符的空终止数组的指针。 |
UnmanagedType.LPWStr | 指向 Unicode 字符的空终止数组的指针。 |
UnmanagedType.TBStr | 具有预设长度并包含平台相关字符的 COM 样式 BSTR。 |
下面的类型定义针对平台调用的调用显示 MarshalAsAttribute 的正确用法。
class StringLibAPI { [DllImport("StringLib.Dll")] public static extern void PassLPStr([MarshalAs(UnmanagedType.LPStr)] String s); [DllImport("StringLib.Dll")] public static extern void PassLPWStr([MarshalAs(UnmanagedType.LPWStr)]String s); [DllImport("StringLib.Dll")] public static extern void PassLPTStr([MarshalAs(UnmanagedType.LPTStr)]String s); [DllImport("StringLib.Dll")] public static extern void PassBStr([MarshalAs(UnmanagedType.BStr)] String s); [DllImport("StringLib.Dll")] public static extern void PassAnsiBStr([MarshalAs(UnmanagedType.AnsiBStr)]String s); [DllImport("StringLib.Dll")] public static extern void PassTBStr([MarshalAs(UnmanagedType.TBStr)] String s); } |
结构中使用的字符串
字符串是结构的有效成员;但是,StringBuilder 缓冲区在结构中是无效的。下表显示当字符串数据类型被作为字段封送时该类型的封送处理选项。MarshalAsAttribute 属性提供了若干个 UnmanagedType 枚举值,以便将字符串封送到字段。
枚举类型 | 非托管格式的说明 |
UnmanagedType.BStr | 具有预设长度和 Unicode 字符的 COM 样式的 BSTR。 |
UnmanagedType.LPStr | 指向 ANSI 字符的空终止数组的指针。 |
UnmanagedType.LPTStr | 指向平台相关的字符的空终止数组的指针。 |
UnmanagedType.LPWStr | 指向 Unicode 字符的空终止数组的指针。 |
UnmanagedType.ByValTStr | 定长的字符数组;数组的类型由包含数组的结构的字符集确定。 |
ByValTStr 类型用于出现在结构内的内联的定长字符数组。其他类型应用于包含指向字符串的指针的结构内所包含的字符串引用。
应用于包含结构的 StructLayoutAttribute 属性的 CharSet 参数确定结构中字符串的字符格式。下面的示例结构包含字符串引用和内联字符串,以及 ANSI、Unicode 和平台相关字符。
类型库表示形式
struct StringInfoA { char * f1; char f2[256]; }; struct StringInfoW { WCHAR * f1; WCHAR f2[256]; BSTR f3; }; struct StringInfoT { TCHAR * f1; TCHAR f2[256]; }; |
下面的代码示例显示如何使用 MarshalAsAttribute 属性以不同格式定义同一结构。
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] struct StringInfoA { [MarshalAs(UnmanagedType.LPStr)] public String f1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public String f2; } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] struct StringInfoW { [MarshalAs(UnmanagedType.LPWStr)] public String f1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public String f2; [MarshalAs(UnmanagedType.BStr)] public String f3; } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] struct StringInfoT { [MarshalAs(UnmanagedType.LPTStr)] public String f1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public String f2; 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-462654/,如需转载,请注明出处,否则将追究法律责任。
上一篇:
input类型和限制
下一篇:
Windows Live平台开发资源
![]()
请登录后发表评论
登录
全部评论
<%=items[i].createtime%>
<%=items[i].content%> <%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%}%> <%}%>
<%=items[i].items.items[j].createtime%>
<%=items[i].items.items[j].username%> 回复 <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>
还有<%=items[i].items.total-5%>条评论
) data-count=1 data-flag=true>点击查看
<%}%>
|
转载于:http://blog.itpub.net/12639172/viewspace-462654/