各位高手:
  小弟我有一个问题搞不明白,想向各位请教.在VC6中编写了一个DLL,其中有函数
ushort OpenPort(short ivPortNo, ulong ivBaud, short ivParity, HANDLE * devHandle),HANDLE * devHandle是在打开设备的时候需要返回的设备句柄,在其他各种语言中调用都没有问题,但在C#中我不知道如何调用,请高手赐教,谢谢.(在测试中我有试过在C#中申明为public static extern ushort OpenPort(short ivPortNo, ulong ivBaud,
            short ivParity, out int devHandle);编译能过,但运行时报 尝试读取或写入受保护的内存错误.)

解决方案 »

  1.   

    还有就是我也有试过在C#中申明为public static extern ushort OpenPort(short ivPortNo, ulong ivBaud, short ivParity, out Intptr devHandle); 同样编译能过,但运行时报 尝试读取或写入受保护的内存错误.
      

  2.   

    have a try
    ref IntPtr devHandle
      

  3.   

    我看了DLL的源代码,出错的语句是*(devHandle)= hout,其中hout是打开的设备句柄.
      

  4.   

    那你是否能够改改源码,为什么要用Handle*呢,你用Handle不就可以在C#中用Intptr了转换了吗,试试
      

  5.   

    调用的方法是:
    Intptr rHandle = inptr.zero;
    short ivPortNo = 1;
    ulong ivBaud = 0;
    short ivParity = 0;
    OpenPort(ivPortNo, ivBaud, ivParity, out rHandle );
      

  6.   

    肯定不能这样使用out,你可以如下试试
    [DllImport(...)]
    public static extern ushort OpenPort( short ivPortNo, 
                 uint ivBaud, short ivParity, 
                 [Out] ref Intptr devHandle); //Call
    Intptr rHandle = inptr.zero;
    short ivPortNo = 1;
    uint ivBaud = 0;
    short ivParity = 0;
    OpenPort(ivPortNo, ivBaud, ivParity, ref rHandle );
      

  7.   

    [DllImport(...)]
    public static extern ushort OpenPort( short ivPortNo, 
                 uint ivBaud, short ivParity, 
                 ref Intptr devHandle); //Call
    Intptr rHandle = inptr.zero;
    short ivPortNo = 1;
    uint ivBaud = 0;
    short ivParity = 0;
    OpenPort(ivPortNo, ivBaud, ivParity, ref rHandle );这种方法我也有用过,但还是同样的错误.