日期:2014-05-18  浏览次数:21029 次

C#如何调用C++类型参数的api函数呢?主要是类型转换复杂。大家帮一下忙呀,现在2点钟了还不能睡觉,急。。
如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 我怎么肤质呢?

程序员累呀。。高手帮一下,在此谢谢了。。

------解决方案--------------------
unsigned char*在c#中最好用byte[]对应,这里的unsigned char* key_data 应该不能用IntPtr,
------解决方案--------------------
如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 不好确定 

------解决方案--------------------
1.有h文件没有,如果有头文件定义,可以使用工具自动转换

一般常用工具是swig,没有头文件的化,转换麻烦点。需要手动一个一个转

2.上面已经说了那个可以是 char[],byte[] 或者stringBuild。至于你要如何传递参数。我想这个并不是问题

string to char[] 
string to byte[]
都并不复杂
------解决方案--------------------
Marshal.StringToHGlobalAnsi or StringToHGlobalAuto 
具体看编码要求,
这个方法可以在msdn查
------解决方案--------------------
其实对于unsigned char* 
我个人喜欢定义成
[MarshalAs(UnmanagedType.LPStr)] StringBuilder 


毕竟StringBuilder很容易使用
------解决方案--------------------
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楼提供的定义尝试,你的定义本身就是错误的,看描述,密钥部分必须是指定字节码,而你却传递字符串,那样能验证通过就怪了。
------解决方案--------------------
[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) ;
你写成这样是对的
------解决方案--------------------
探讨
引用:

引用:
引用:

unsigned char *key_data : KEY 数据或 KEY 选择子
* 使用读卡器内置密码: 1 字节
* 用户指定密码: 6 字节
unsigned char *UIDs : UIDs

这个 1字节 6字节 说的是 key_data 还是 UIDs,如果是 key_data,那……

------解决方案--------------------
c++调用那个unsinged char *key_data输入的是什么?
------解决方案--------------------
去 win7 上调试 能出正确 标准答案。。
XP不一定兼容win7