C++ 函数
int APIENTRY CR_Reset(HANDLE ComHandle, BYTE _Eject );
//参数
//_Eject:弹卡选择 0x30=不弹卡 0x31=弹卡到前端 0x32=弹卡到后端。
//返回值:
//如果函数调用成功,返回值为0。
c# 调用
[DllImport("CR.dll", EntryPoint = "CR_Reset", SetLastError = true,
        CharSet = CharSet.Ansi, ExactSpelling = true,
        CallingConvention = CallingConvention.StdCall)]
        public static extern int CRT310_Reset(IntPtr ComHandle, System.Byte _Eject);System.Byte flag = 0x31;
crt = CRT310_Reset(ComHandle, Convert.ToByte(flag));这样写有问题吗?为什么返回值不等于0
是不是BYTE 传值有问题
请高手指教

解决方案 »

  1.   

    crt = CRT310_Reset(ComHandle, 0x31);
    这样应该就可以了,试试看吧^_
    ^
      

  2.   


    不好意思
    这里写错了
    CRT310_Reset(ComHandle, Convert.ToByte(flag));
    应该是CR_Reset(ComHandle, Convert.ToByte(flag));
      

  3.   

    我以前碰到过这样的问题,返回值就是不正确,也是用C#调用C++的代码查了2天,最后拿到了DLL的源代码,其实源代码并没有错误,但是C#调用好象就会有问题
    DLL代码大约是这样的
    ....
    return Operation(XXXX);
    }
    Operation(XXXX)这个函数执行会返回一个int型的值,这样用C#调用就是出错,用C++调用正常我们把DLL改成
    ...
    int res = Operation(XXXX);
    return res;
    }
    用C#调用才正常,一直不知道是什么原因,希望高手讲解下...
    楼主也试试这个方法看能解决你的问题不
      

  4.   

    关键是拿不到他们的DLL源码应该还是有办法可以解决吧
      

  5.   

    比如说这个DLL 里 有个打开串口的函数 返回值是没有问题的是好用的能不能是传0x30参数的时候,有问题
      

  6.   

    如果其他的函数返回是对的,那应该不是象楼上说的是函数定义的问题.毕竟同一个DLL里的函数的编写方式应该是一样的.
      

  7.   

    困扰两天了一直弄不明白网上查资料 这样写是正常的DLL 是没有问题的 用别的程序测试过了用C#这样就有问题
      

  8.   

    kingdomgps(工作没激情) 你传过BYTE 值类型的吗?传16进制的是不是就会有这样的问题
      

  9.   

    BYTE类型能够跟什么进制表示没有关系的
    你用十六进制和十进制只是表现形式不一样,实际的值是一样的
    这个不是需要考虑的地方
      

  10.   

    [DllImport("CR.dll")]
    public static extern int CRT310_Reset(IntPtr ComHandle, System.Byte _Eject);System.Byte flag = 0x31;
    int crt = CRT310_Reset(ComHandle, flag );