如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 我怎么肤质呢?程序员累呀。。高手帮一下,在此谢谢了。。
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 我怎么肤质呢?程序员累呀。。高手帮一下,在此谢谢了。。
解决方案 »
- 100分 winform 高级问题啊 请大仙们援手 感激不尽(在线等)
- Winform 文字怎么换行
- 后台需要过滤参数防止sql注入吗?
- 一个类里面只有一个构造函数吗,不能再重载一个构造函数吗
- SQL查询问题急求解决办法
- 多线程同步 串口
- 如果我的TreeView是通过SQL动态生成的,请问:如何不通过postback,即在客户端进行节点的展开??
- vs2005如何开始一个使用c#得asp.net webform项目,我安装vs2005得时候只是选择了c#?
- 请问:如何实现统一个按钮在不同的情况下实现不同的功能。我用的多态,不好用。
- winform基本控件Label继承问题
- wpf 用cs代码写动画
- 为什么用过 Dotfuscator 处理的过exe ,ildasm.exe 还是可以打开转到 IL文件?
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 不好确定
string to byte[]
都并不复杂
具体看编码要求,
这个方法可以在msdn查
我个人喜欢定义成
[MarshalAs(UnmanagedType.LPStr)] StringBuilder
毕竟StringBuilder很容易使用
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");
试验下
[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, ...);
功 能: 核对 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);
请问一下,这样写有错吗?可总是不能返回零。密钥也是对的。
项目属性把unsave钩打上就好了。
* 使用读卡器内置密码: 1 字节
* 用户指定密码: 6 字节
unsigned char *UIDs : UIDs这个 1字节 6字节 说的是 key_data 还是 UIDs,如果是 key_data,那 UIDs 是什么格式
的格式是:unsigned char *
public static extern int ft_m1_auth(int icdev, 不要特byte sector_num, byte key_mode, string key_data, IntPtr UIDs) ;
你写成这样是对的
如"E455411F"共八位,顺便问一下:UCHAR ukeyset[24] = {0} ; C++里这种是什么东西,怎么用?
八位 那就声明和长度为 8 的 byte 数组传进去
XP不一定兼容win7