如C++的函数是:
int ft_m1_auth(int icdev, unsigned char sector_num, unsigned char key_mode, unsigned char* key_data, unsigned char *UIDs) ;我用C#
  [DllImport("RK501APIV2.dll")]
   public static extern int ft_m1_auth(int icdev, int sq, int mode, string key);这个可能是错的。反正就是没有调成功过现在主要是 unsigned char* 这种类型用C#怎么写。意思好像就是一无符号的指针地址吗?如果我要传一个参数进去“ABCDE”该怎么办?
 别外 unsigned char* key_data  是不是可以换碾 IntPtr key_data  ,如果这样可以IntPtr key_data  中的key_data  我怎么肤质呢?程序员累呀。。高手帮一下,在此谢谢了。。

解决方案 »

  1.   

    unsigned char*在c#中最好用byte[]对应,这里的unsigned char* key_data 应该不能用IntPtr,
      

  2.   

    如C++的函数是:
    int ft_m1_auth(int icdev, unsigned char sector_num, unsigned char key_mode, unsigned char* key_data, unsigned char *UIDs) ;
    [DllImport("RK501APIV2.dll")]
    public static extern int ft_m1_auth(int icdev, int sq, int mode, string key);这
    ==============================================================
    你写的这两个并不对应阿,当然要出错,intptr 可以用,只要你知道如何构造这个intptr ,
    intptr 在平台调用下,一般用来表示非托管的指针,可以在这种场合使用。关键是它指向的内容是什么样子的
    比如大小
    一般情况下,这个函数的c#声明
    [dllimport....]
    .... int ft_m1_auth(int icdev, byte sector_num , byte key_mode, intptr key_data, intptr UIDs) ;
    调用的话,你最好参考c++如何它的,主要是 uids key_data 这两个参数无法确定到底传入多大一块内存,如果过小的话,dll里面可能要出错
    例如一般这样
    intptr uids = Marshal.AAllocHGlobal(size) ;size 不好确定 
      

  3.   

    你起床真早!谢谢,那比如我在给 intptr key_data 中的 key_data传入一个字符“ A0A1A2AA4A5”该怎么办呢?
      

  4.   

    1.有h文件没有,如果有头文件定义,可以使用工具自动转换一般常用工具是swig,没有头文件的化,转换麻烦点。需要手动一个一个转2.上面已经说了那个可以是 char[],byte[] 或者stringBuild。至于你要如何传递参数。我想这个并不是问题string to char[] 
    string to byte[]
    都并不复杂 
      

  5.   

    Marshal.StringToHGlobalAnsi or StringToHGlobalAuto 
    具体看编码要求,
    这个方法可以在msdn查
      

  6.   

    其实对于unsigned char* 
    我个人喜欢定义成
    [MarshalAs(UnmanagedType.LPStr)] StringBuilder 
    毕竟StringBuilder很容易使用
      

  7.   

    [DllImport("RK501APIV2.dll")]
    public static extern int ft_m1_auth(int icdev, byte sector_num, byte key_mode, byte[] key_data, byte[] UIDs);最初的声明少了一个参数,第二第三个参数类型也不对, key_data 可以传
    byte[] key_data = Encoding.ASCII.GetBytes("A0A1A2AA4A5\0");
    UIDs 也这样
    byte[] UIDs = Encoding.ASCII.GetBytes(...... + "\0");
    试验下
      

  8.   

    这个参数传的不一定是字符串,最好不要指定 StringBuilder ,这个函数有没有参数的说明,或者函数体代码?
      

  9.   

    现在最主要的问题是:如 unsigned char* key_data 这个参数要求我传的是一个密钥的意思。如果我把这里申明成IntPtr key_data  ,那么调用的时候这个参数我该用什么呢?
      

  10.   

    密钥的长度是固定的吧,那就声明成 byte[] ,没必要 IntPtr
    [DllImport("RK501APIV2.dll")]
    public static extern int ft_m1_auth(int icdev, byte sector_num, byte key_mode, byte[] key_data, byte[] UIDs);byte[] key_data = Encoding.ASCII.GetBytes("A0A1A2AA4A5");
    ft_m1_auth(..., key_data, ...);
      

  11.   

    C++int ft_m1_auth(int icdev, unsigned char sector_num, unsigned char key_mode, unsigned char* key_data, unsigned char *UIDs) ;
    功 能: 核对 M1 卡的密码
    参 数: 
              int icdev : 通讯设备标识符
              unsigned char sector_num: 扇区号
              unsigned char key_mode : KEY 模式 
                        * 使用读卡器内置密码: RY501_E2ROM_KEYA, RY501_E2ROM_KEYB
                        * 用户指定密码: RY501_USER_KEYA , RY501_USER_KEYB
              unsigned char *key_data : KEY 数据或 KEY 选择子
                        * 使用读卡器内置密码: 1 字节
                        * 用户指定密码: 6 字节
              unsigned char *UIDs : UIDs返 回: 成功返回0现在我定义的C#:
       [DllImport("RK501APIV2.dll")]
             public static extern int ft_m1_auth(int icdev, byte sector, byte key_mode,string key, IntPtr uid);调用 :
       byte modess = 0x1A;
                    byte cc = 0x00;
                    int key = CARDAPICALL.ft_m1_auth(0, cc, modess, "FFFFFFFFFFFF", IdBuffer);
    请问一下,这样写有错吗?可总是不能返回零。密钥也是对的。
      

  12.   

    int ft_m1_auth(int icdev, unsigned char sector_num, unsigned char key_mode, unsigned char* key_data, unsigned char *UIDs) ;public unsave int ft_m1_auth(int icdev,byte sector_num, byte  key_mode, byte * key_data, byte  *UIDs) ;
    项目属性把unsave钩打上就好了。
      

  13.   

    unsigned char *key_data : KEY 数据或 KEY 选择子
    * 使用读卡器内置密码: 1 字节
    * 用户指定密码: 6 字节
    unsigned char *UIDs : UIDs这个 1字节 6字节 说的是 key_data 还是 UIDs,如果是 key_data,那 UIDs 是什么格式
      

  14.   


    的格式是:unsigned char *
      

  15.   

    [DllImport("RK501APIV2.dll", ExactSpelling = false)]
       public static extern int ft_m1_auth(int icdev, 不要特byte sector_num, byte key_mode, string key_data, IntPtr UIDs) ;
    你写成这样是对的
      

  16.   


    如"E455411F"共八位,顺便问一下:UCHAR  ukeyset[24] = {0} ; C++里这种是什么东西,怎么用?
      

  17.   

    char[] array = new char[24];
    八位 那就声明和长度为 8 的 byte 数组传进去
      

  18.   

    谢谢这们兄弟耐心的回答。能否加一下你的QQ;我的QQ是:3762299
      

  19.   

    c++调用那个unsinged char *key_data输入的是什么?
      

  20.   

    去 win7 上调试 能出正确 标准答案。。
    XP不一定兼容win7