写了一个读卡的程序,厂商提供了一个dll,和一个接口过程.但是照搬上去不行,查其原因可能是调用dll的方式是静态调用的,查了一些动态调用的资料,但是还是没有解决问题,以前没有接触过dll.希望高手指教.目前错误的形势是:不开读卡机(即不联机)运行程序就报错.如果打开机器再运行程序就不会报错,所以我想换为动态的调用应该不会出错了.
以下是代码:
function OmrS(Cmd:Pchar):Integer;stdcall;external'A50COM.DLL';
function OmrG(Buf:PChar):Integer;stdcall;external'A50COM.DLL';
调用的时候的代码
procedure TFrmmzcp.dxBarButton2Click(Sender: TObject);
var
Cmd:array[0..254] of char;
Buf:array[0..254] of char;
sp: array[0..199] of char;
begin
Cmd:='S A50Com.DLL/'; //FOMFILE.FOM为发送格式文件名
OmrS(cmd);
OmrG(Buf);
If copy(buf,1,2)='08' then exit ; //阅卷机未联机,返回
Memo1.lines.clear;
while true do
begin
FillChar(sp, 200, Ord(' '));
Cmd:= '/ ';
OmrS(Cmd); //送读卡命令'/'+' '
OmrG(Buf); //取读卡返回字串
if Copy(Buf,1,2)='OK' then
begin
Edit1.Text:='OK';
strpcopy(Cmd,'001'+sp+'/');
OmrS(Cmd); //送取数据命令
OmrG(Buf); //取返回字串
memo1.lines.add(Copy(Buf,1,200));
//-----------如果使用双头机使用下列操作取双头机B头数据---------
//strpcopy(Cmd,' 001'+sp+'/');
//OmrS(Cmd); //送B头取数据命令
//OmrG(Buf); //取B头返回字串
//memo2.lines.add(Copy(Buf,1,200)); //显示B头返回字串
//-------------------------------------------------------------
end
else
begin
Cmd:='-/';
OmrS(Cmd); //送停机命令
Edit1.Text:=Copy(Buf,1,2); //显示错误代码
break;
end;
end;
end;
以下是代码:
function OmrS(Cmd:Pchar):Integer;stdcall;external'A50COM.DLL';
function OmrG(Buf:PChar):Integer;stdcall;external'A50COM.DLL';
调用的时候的代码
procedure TFrmmzcp.dxBarButton2Click(Sender: TObject);
var
Cmd:array[0..254] of char;
Buf:array[0..254] of char;
sp: array[0..199] of char;
begin
Cmd:='S A50Com.DLL/'; //FOMFILE.FOM为发送格式文件名
OmrS(cmd);
OmrG(Buf);
If copy(buf,1,2)='08' then exit ; //阅卷机未联机,返回
Memo1.lines.clear;
while true do
begin
FillChar(sp, 200, Ord(' '));
Cmd:= '/ ';
OmrS(Cmd); //送读卡命令'/'+' '
OmrG(Buf); //取读卡返回字串
if Copy(Buf,1,2)='OK' then
begin
Edit1.Text:='OK';
strpcopy(Cmd,'001'+sp+'/');
OmrS(Cmd); //送取数据命令
OmrG(Buf); //取返回字串
memo1.lines.add(Copy(Buf,1,200));
//-----------如果使用双头机使用下列操作取双头机B头数据---------
//strpcopy(Cmd,' 001'+sp+'/');
//OmrS(Cmd); //送B头取数据命令
//OmrG(Buf); //取B头返回字串
//memo2.lines.add(Copy(Buf,1,200)); //显示B头返回字串
//-------------------------------------------------------------
end
else
begin
Cmd:='-/';
OmrS(Cmd); //送停机命令
Edit1.Text:=Copy(Buf,1,2); //显示错误代码
break;
end;
end;
end;
解决方案 »
- delphi2009自带的indy10.2.5 idtcpserver与idtcpclient传送记录类型时,中文显示乱码
- Delphi2006远程数据模块的问题.
- 在DELPHI中是否有读取I/O端口的函数?
- 关于对话框,我如何实现这样的功能?
- 如何知道一个有重复数据的数组中不相同数据的个数?紧急求救!
- 请问 斑竹 为什么删除 我给 cqzyf 分的帖子!!冤枉! 散分 兄弟们支持!!!!
- 调用dll函数的问题!我已经思考好久了,请指点!
- 关于lookup字段的一些问题,有些迷糊了//准程序员
- 怎样每次都接着上次打印的位置打印
- DBGrid控件(连Table)添加新记录时显示顺序不正常
- 一个控件,在D6下编译,安装使用皆正确,在D5下编译,安装后,使用时出错:XXXFONT.Charset prOperty nOt exist!
- 如何实现这样的功能?
TOmrS=function (Cmd:Pchar):Integer;stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var handle:Thandle;
OmrS:TOmrS;
begin
handle:=loadlibrary('A50COM.DLL');
OmrS:=GetProcAddress(handle,'OmrS');
//...OmrS('xxx')
freelibrary(handle);
end;
begin
Edit1.Text := GetMainBoardID();
end;
你需要
1. 定义跟你DLL引出的函数相同的函数指针
2. loadlibrary..
3. GetProcAddress.
4. ...
5. FreeLibrary..中间需要对返回值进行判断 判断是否成功