写了一个读卡的程序,厂商提供了一个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;    

解决方案 »

  1.   

    type
      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;
      

  2.   

    Function GetMainBoardID():Pchar;stdcall;external 'GetSysInfo.dll'; procedure TForm1.FormShow(Sender: TObject);
    begin
      Edit1.Text := GetMainBoardID();
    end;
      

  3.   

    动态调用
    你需要
    1. 定义跟你DLL引出的函数相同的函数指针
    2. loadlibrary..
    3. GetProcAddress.
    4. ...
    5. FreeLibrary..中间需要对返回值进行判断 判断是否成功