要做一个自动读取卡信息的程序,需要一个Timer每1秒寻一次卡,同样的一段代码 放到一个按钮事件中可以正常执行,放到timer事件中提示内存错误,是不是有什么东西没有释放掉procedure TfrmEmpM1.Timer1Timer(Sender: TObject);
var st,Snr,pst:Integer;
    CardNo,Init,Amt,Sta,Pass,Data:String;
    databuff:Array[0..15]of Char;
begin
  showmessage('请插卡');
  rf_halt(icdev);
  st:=rf_card(icdev,0,Snr);   //寻卡
  if st=0 then begin
    rf_beep(icdev,10);
    pass:=chr($ff)+chr($ff)+chr($ff)+chr($ff)+chr($ff)+chr($ff);
    if rf_load_key_Hex(icdev,0,0,pass)=0 then
      pst:=rf_authentication(icdev,0,0);         //比较卡密码
    if st=pst then begin
      st:=rf_read(icdev,1,@databuff);            //读卡
      Label1.Caption:=databuff;
      rf_beep(icdev,10);
    end;
  end;
end;

解决方案 »

  1.   

    错误内容大致就是这个样子,'mwfr32.dll'是调用的一个读卡函数
    Access violation at Address100020f2 in module 'mwfr32.dll'.Write or address 0000013
      

  2.   

    你还是跟踪测试一下吧,也可能是这个'mwfr32.dll'损坏了
      

  3.   

    跟踪测试没有什么问题,就是到最后end的时候就出错误了,'mwfr32.dll'没有问题,这段代码放到一个按钮事件中是可以执行的
      

  4.   

    是这行代码有问题 什么问题我不知道 谁能帮我解答
    st:=rf_card(icdev,0,Snr); //寻卡
      

  5.   

    这种东西,最好用多线程调用!!
    应该是资源释放问题;
    另外你可以把执行时间间隔加长,再看是否会出错,如果出错则一定是dll 的资源释放问题;
      

  6.   

    可能是读卡时间超过1秒,造成Timer在同一时间内多次调用dll,猜测而已,可以试试下面的方法procedure TfrmEmpM1.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enable := False;... ...  Timer1.Enable := True;
    end;