平台调用,匹配非托管char[]类型的问题

对于动态库的调用msdn已经很详细了,对于各种情况都有所介绍,如果能写出简单的几个调用来,那么其他的就可以以此类推,自然会迎刃而解。不过对于非托管代码的参数,如果是char[]类型的,那么就会出现一些问题,其他很多情况都很正常,但不确定是否还有以外情况。这个问题最后来说,先写两个刚写的调用windows api的托管原型,如何调那么就和其他托管代码情况一样了,api的非托管原型参考msdn的platform sdk。
[ DllImport( "User32.dll",CharSet=CharSet.Auto )]
  public static extern int MessageBeep( int hWnd);
  [ DllImport( "kernel32.dll",CharSet=CharSet.Ansi )]
  public static extern bool MoveFile(string lpExistingFileName,string lpNewFileName);
  [ DllImport( "kernel32.dll",CharSet=CharSet.Auto )]
  public static extern bool DeleteFile(string lpExistingFileName);

稍微复杂点的托管原型可能用到结构等和其他类型,具体操作msdn上写了很多了,不过这个[ MarshalAs( UnmanagedType.AsAny )]特性还是很好用的,可以提供很大的灵活性。
  [DllImport("someDll.dll", SetLastError=true,CharSet=CharSet.Auto), SuppressUnmanagedCodeSecurity]
  internal static extern IntPtr someMethod(int para1,string para2,
   [ MarshalAs( UnmanagedType.AsAny )] Object object1,int length);
如果有很多个方法都调用非托管someMethod方法而且传入的参数却是不同类型的(因为非托管下可能传递指针),那么可以如上这么做,在参数类型不确定的位置对应上面的object1参数。运行时会在运行时自动确定对象的类型然后加以转换。
最后就应该是开始所说的如果非托管参数是char str[16]类型的情况了,这种情况下,msdn的方法是[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=16)]
  public string strTitle2;
但是这样的话,最后一个字节会被托管类型的string的结束符给强行占用掉而不能传送,也就是可以理解为最后一个因为字母不能传送。可以用一种替代的方法如下来替代:
[MarshalAs(UnmanagedType.ByValArray, SizeConst=16,  ArraySubType = UnmanagedType.LPTStr)]
public char[] strTitle1;
这样的话如果你只有字符和数字的话还是可以准确的marshal,当时想到的时候的确还是令我开心了一会。但是如果存在汉字的情况的话marshal结果肯定是错误的。

上面的问题在gotdotnet上面也看到过,同样没有看到解决方案,情况和结果和我一样,但是别人没有汉字的情况。希望2005下会没有这个问题吧,空了看看。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值