现在的位置: 首页 > 综合 > 正文

.NET(C#)平台调用:字符串的默认封送形式是UnmanagedType.LPTStr,但是……

2012年09月06日 ⁄ 综合 ⁄ 共 878字 ⁄ 字号 评论关闭

MSDN的这篇文章有点讲地不清楚:http://msdn.microsoft.com/en-us/library/s9ts558h.aspx

 

文中说的字符串的COM调用默认封送形式是UnmanagedType.Bstr,而平台调用的默认封送形式是UnmanagedType.LPTStr。这个LPTStr是和平台相关的,就是WinAPI中的TCHAR定义(98/Me是ANSI,NT/2000/XP/…是Unicode)。然后这一段落就结束了……是的,MSDN上面的这些说的都没错,但是它应该提一下平台调用的字符集的选择,就是关于DllImportAttribute.CharSet字段,因为上面的平台调用的字符串封送形式是和DllImportAttribute.CharSet有关系的。CharSet是Ansi(默认是这样的),字符串会以Ansi编码封送,而如果是CharSet.Unicode,字符串会以Unicode编码封送。而如果是CharSet.Auto,字符串才会以上面提到的“平台调用默认形式:UnmanagedType.LPTStr”封送!(这也是为什么许多平台调用DllImport特性中总会出现CharSet.Auto字样)。

 

看这个例子:

[DllImport("user32.dll")]

static extern int MessageBoxA(IntPtr hWnd, string text, string caption, uint type);

 

这里引用API的MessageBoxA函数(注意后面有个”A”,代表ANSI编码版函数),如果平台调用字符串封送默认真的总是以UnmanagedType.LPTStr的话,那么在我的Windows 7下该方法肯定不会成功显示指定的字符串,因为这是个只支持ANSI的函数。而事实上可以显示,因为这里DllImportAttribute的CharSet字段值默认是CharSet.Ansi!

 

推荐读另一篇文章:

.NET(C#):平台调用DllImportAttribute.CharSet和字符串封送编码

抱歉!评论已关闭.