c# winform程序 调用读卡器的c++ dll ,高分求大虾们指导。

有个c++写的dll,HW300.DLL;里面有这么个函数intReadCard(intportnumber,inttracknumber,inttimeout,unsi... 有个c++写的dll,HW300.DLL;里面有这么个函数int ReadCard(int portnumber,int tracknumber,int timeout,unsigned char* track1,int* track1len,unsigned char* track2,int* track2len,unsigned char* track3,int* track3len) 读卡的函数;我想在winform里建个textbox文本框,读出磁卡数据,如何做?
portnumber(in): 串口号,1 代表 COM1;2 代表 COM2;3 代表 COM3...
tracknumber(in):磁道选择
1 代表磁道1;
2 代表磁道2;
3 代表磁道3;
12 代表磁道1和磁道2;
23 代表磁道2和磁道3;
123 代表磁道1和磁道2和磁道3;
timeout(in):超时控制,单位为秒。读卡应在此时间范围内完成,超时则写卡机被复位。
track1(out):磁道1接收缓冲区指针
track1len(out):磁道1数据长度指针
track2(out):磁道2接收缓冲区指针
track2len(out):磁道2数据长度指针
track3(out):磁道3接收缓冲区指针
track3len(out):磁道3数据长度指针
返回值:
0 表示 成功;
1 表示 串口无法使用;
2 表示 操作超时;
3 表示 读磁卡失败。
[DllImport("hw300.dll ",EntryPoint="ReadCard", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] extern static int ReadCard(int portnumber, int tracknumber, int timeout, byte[] track1, ref int track1len, byte[] track2, ref int track2len, byte[] track3, ref int track3len);
private void button1_Click(object sender, EventArgs e)
{ textBox1.Focus();
int portnumber = 1; int tracknumber = 2; int timeout = 10; byte[] track1 = { 32 };
int track1len = 100; byte[] track2 = { 32 }; int track2len = 100;
byte[] track3 = { 32 }; int track3len = 100;

int R = ReadCard(portnumber, tracknumber, timeout, track1, ref track1len, track2, ref track2len, track3, ref track3len);
textBox1.Text = R.ToString(); textBox2.Text = track2.ToString(); } 这是我现在程序,但刷不出内容。
展开
 我来答
幽煌魔火
2012-09-25 · 超过17用户采纳过TA的回答
知道答主
回答量:43
采纳率:0%
帮助的人:39.9万
展开全部
先用C#专用的DLL导入格式(不会自己找,网上多的是)
唯一注意的就是参数要转换成C#的参数类型
int ReadCard(int portnumber,int tracknumber,int timeout,unsigned char* track1,int* track1len,unsigned char* track2,int* track2len,unsigned char* track3,int* track3len)

把其中的指针类型换成ref 或者out 就可以了
unsigned char* track1--------ref string[] track1
int* track1len------------ref int track1len
追问
哥们 有没有QQ 或者百度hi 我把代码发你看看,类型转换已经弄好了 ,但还是不行
追答
int ReadCard(int portnumber,int tracknumber,int timeout,unsigned char* track1,int* track1len,unsigned char* track2,int* track2len,unsigned char* track3,int* track3len) 

int portnumber = 1; int tracknumber = 2; int timeout = 100; string[] track1=new string[500] ; int track1len = 100; string[] track2=new string[500]; int track2len = 100;
string[] track3=new string[500]; int track3len = 100;

用上面的类型试下,不要用byte[],
厉高扬6M
2012-09-26 · TA获得超过137个赞
知道答主
回答量:96
采纳率:0%
帮助的人:59.9万
展开全部
unsigned char* 对应StringBuilder试试看,一般如果是C++输出参数,像无符号整形这样的,你需要预先分配内存空间给他的,你上面byte[] track2 = {32};这个表示只分配一个字节啊
建议你写成这样StringBuilder s = new StringBuilder(256);//分配256个字符的空间,具体长度最好卡商确认下。看你图里报的错就是内存分配有问题引起的,导致写入错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
walkingFY
2012-09-25 · 超过11用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:22.5万
展开全部
这个问题问得好,你都把方法写出来了,你直接调用不就行了吗,主要问题就是在于要传递的参数,这些参数应该都是从磁卡里边获取的,这个就看你如何获取磁卡额信息了啊。
更多追问追答
追问
参数里,前3个是输入参数,主要是串口的操作,后面的都是输出参数,输出参数在于刷卡后显示的信息,这个参数我该如何定义?
追答
C#用于返回的方法是啥  是不是 public int Monthod(out byte[] para1),这样是用于接收返回的.
那个指针相当于BYTE类型吗,然后你就用这个试一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式