字符串的封送处理

  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 参数确定结构中字符串的字符格式。下面的示例结构包含字符串引用和内联字符串,以及 ANSIUnicode 和平台相关字符。

类型库表示形式

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类型和限制
user_pic_default.png
请登录后发表评论 登录
全部评论
<%=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%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%> <%}%>

转载于:http://blog.itpub.net/12639172/viewspace-462654/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值