yd-606磁卡能写不能读(200分) ( 积分: 200 )

  • 主题发起人 主题发起人 HNXXCXG
  • 开始时间 开始时间
H

HNXXCXG

Unregistered / Unconfirmed
GUEST, unregistred user!
使用厂家的DLL

我的代码:
{*******************************************************}
{ }
{ 陈新光 }
{ }
{ 版权所有 (C) 2007 咏南工作室 }
{ }
{*******************************************************}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
edt1: TEdit;
btn3: TButton;
lbl1: TLabel;
procedure btn3Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function RTr2card(comn:string;out inTr2str:string):Integer;stdcall;external'rwcommnew.dll';
function WTr2card(comn,inTr2str:string):Integer;stdcall;external'rwcommnew.dll';
function RTr3card(comn,inTr3str:string):Integer;stdcall;external'rwcommnew.dll';
function WTr3card(comn,inTr3str:string):Integer;stdcall;external'rwcommnew.dll';
function RTr23card(comn,inTr2str,inTr3str:string):Integer;stdcall;external'rwcommnew.dll';
function WTr23card(comn,inTr2str,inTr3str:string):Integer;stdcall;external'rwcommnew.dll';

implementation

{$R *.dfm}

procedure TForm1.btn3Click(Sender: TObject);
begin
edt1.Clear;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
if WTr2card('com1',edt1.Text)<>1 then
ShowMessage('error');
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
if RTr3card('com1',edt1.Text)<>1 then
ShowMessage('error')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edt1.Text:='7758520';
end;

end.
 
7758520,已经写进磁卡的二磁道,但就是读不出来。
读的时候,读指示灯亮,刷卡OK灯亮,但就是读不出来,急
 
procedure TForm1.btn2Click(Sender: TObject);
begin
if WTr2card('com1',edt1.Text)<>1 then
ShowMessage('error');
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
if RTr3card('com1',edt1.Text)<>1 then
ShowMessage('error')
end;

大哥,你调用的是写二轨的函数来将内容写入二轨,但却调用读三轨的函数来从三轨读内容,他磁卡读写器就是有天大的本事也读不出来的啊。
 
感谢寻绎,我会给你加分的
但是调用RTr2card,也读不出来
 
顶一下,看高手解决问题
 
读不出来,还是显示不出来?
厂家的DLL有delphi格式的api吗?如果有看看下面的代码能不能用?如果没有,把c格式的贴上来看看
procedure TForm1.btn1Click(Sender: TObject);
var
recv:string;
begin
setlength(recv,xxx);
if RTr3card('com1',recv)<>1 then
ShowMessage('error');
edit1.text := recv;
end;
 
厂家的说明书
RWCOMM.DLL 说明书

RWCOMM.DLL 是一个WIN32下的关于RQ606磁卡/存折读写器的动态链库,它支持BP8902指令格式。以下就分别对RWCOMM.DLL的各个函数预以说明。

1 写双磁道
函数原型 int WTr23card(char* comn,char* inTr2str,char* inTr3str)
Tr2Str是第二道写数据,Tr3Str是第三道写数据。将Tr2Str和Tr3Str分别写在磁卡第2、3道。按《ESC》键退出。
返回,整型
=1 写卡正确。
=-1 所选串口打不开。
=-4 写卡错误
=-5 用户ESC退出
参数:COMN 字符串,用来设置串口。
格式:COM1 或者说COM2
例如:WT23 card(“COM1”,“222222222”,“33333333333333”);
其中:222222222指的是第二道数据;
333333333指的是第三道数据。


2 写单二磁道
函数原型 int WTr2card(char* comn,char* inTr2str)
Tr2Str是第二道写数据。将Tr2Str写在磁卡第2道。按《ESC》键退出。
返回,整型
=1 写卡正确。
=-1 所选串口打不开。
=-4 写卡错误
=-5 用户ESC退出
参数:COMN 字符串,用来设置串口。
格式:COM1 或者说COM2
例如:WT23card(“COM1”,“222222222”);
其中:222222222指的是第二道数据;

3 写单三磁道
函数原型 int WTr3card(char* comn,char* inTr3str)
Tr3Str是第二道写数据。将Tr3Str写在磁卡第3道。按《ESC》键退出。
返回,整型
=1 写卡正确。
=-1 所选串口打不开。
=-4 写卡错误
=-5 用户ESC退出
参数:COMN 字符串,用来设置串口。
格式:COM1 或者说COM2
例如:WT23card(“COM1”,“333333333333”);
其中:3333333333指的是第二道数据;

4 读双磁道
函数原型 int RTr23card(char*comn,char* inTr2str,char* inTr3str)
该函数等待刷卡,然后读磁卡。
如果读成功则Tr2Str是第二道数据,Tr3Str是第三道数据;否则Tr2Str和Tr3Str是空。
返回,整型
=1 读卡正确。
=-1 所选串口打不开。
=-4 读卡错误
=-5 用户ESC退出
参数:COMN 字符串,用来设置串口。
格式:COM1 或者说COM2

5 读单二磁道
函数原型 int RTr2card(char*comn,char* inTr2str)
该函数等待刷卡,然后读磁卡。
如果读成功则Tr2Str是第二道数据;否则Tr2Str是空。
返回,整型
=1 读卡正确。
=-1 所选串口打不开。
=-4 读卡错误
=-5 用户ESC退出
参数:COMN 字符串,用来设置串口。
格式:COM1 或者说COM2

6 读单三磁道
函数原型 int RTr3card(char*comn,char* inTr3str)
该函数等待刷卡,然后读磁卡。
如果读成功则Tr3Str是第二道数据;否则Tr3Str是空。
返回,整型
=1 读卡正确。
=-1 所选串口打不开。
=-4 读卡错误
=-5 用户ESC退出
参数:COMN 字符串,用来设置串口。
格式:COM1 或者说COM2
 
the declare under pb should be:
FUNCTION int WTr2card(string inb, REF string inTr2str) LIBRARY "mydll.DLL"
FUNCTION int WTr3card(string inb, REF string inTr3str) LIBRARY "mydll.DLL"
FUNCTION int WTr23card(string inb, REF string inTr2str, REF string inTr3str) LIBRARY "mydll.DLL"
FUNCTION int RTr2card(string inb, REF string inTr2str) LIBRARY "mydll.DLL"
FUNCTION int RTr3card(string inb, REF string inTr3str) LIBRARY "mydll.DLL"
FUNCTION int RTr23card(string inb, REF string inTr2str, REF string inTr3str) LIBRARY "mydll.DLL"
 
{*******************************************************}
{ }
{ 陈新光 }
{ }
{ 版权所有 (C) 2007 咏南工作室 }
{ }
{*******************************************************}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
edt1: TEdit;
btn3: TButton;
lbl1: TLabel;
procedure btn3Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function RTr2card(comn,inTr2str:string):Integer;stdcall;external'rwcommnew.dll';
function WTr2card(comn,inTr2str:string):Integer;stdcall;external'rwcommnew.dll';

implementation

{$R *.dfm}

procedure TForm1.btn3Click(Sender: TObject);
begin
edt1.Clear;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
if WTr2card('com1',edt1.Text)<>1 then
ShowMessage('error');
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
if RTr2card('com1',edt1.Text)<>1 then
ShowMessage('error');
end;

end.
 
还是能写不能读出来显示
 
深圳韵达通的产品,型号yd-606

找厂家,居然没有任何反应,真不知道它们搞技术的到哪里去了。找来找去,只是些搞推销的。
 
跟我估计的一样,原型转换错误,改为以下就可以了,
function RTr2card(comn, inTr2str: pchar):Integer;stdcall;external'rwcommnew.dll';
function WTr2card(comn, inTr2str: pchar):Integer;stdcall;external'rwcommnew.dll';

///////改正后的程序
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
edt1: TEdit;
btn3: TButton;
lbl1: TLabel;
procedure btn3Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function RTr2card(comn, inTr2str: pchar):Integer;stdcall;external'rwcommnew.dll';

function WTr2card(comn, inTr2str: pchar):Integer;stdcall;external'rwcommnew.dll';

implementation

{$R *.dfm}

procedure TForm1.btn3Click(Sender: TObject);
begin
edt1.Clear;
end;

procedure TForm1.btn2Click(Sender: TObject);
var
comm, sSend: string; //用pchar类型也可以,只是注意要预先分配内存
begin
comm := 'com1';
sSend := edit1.text;

if WTr2card(pchar(comm), pchar(sSend))<>1 then
ShowMessage('error');
end;

procedure TForm1.btn1Click(Sender: TObject);
var
comm, sRecv: string; //用pchar类型也可以,只是注意要预先分配内存
begin
comm := 'com1';
SetLength(sRecv, 1024);//!预先分配所需内存,1024为所需的长度

if RTr2card(pchar(comm), pchar(sRecv))<>1 then
ShowMessage('error')
else
edit1.text := sRecv;
end;

end.
 
感谢johnYale,果然是要预先分配内存,问题解决
 
多人接受答案了。
 
后退
顶部