"Access violation at address 400068E2 in module 'rtl70.bpl'."

manfredliu 2008-11-13 01:30:40
我在做明华射频卡时出现的错误:"Access violation at address 400068E2 in module 'rtl70.bpl'."

程序代码:

snr:=0;
sector:=7; //第8扇区
block:=28; //第8扇区的第一个块
loadmode:=0; //密码验证方式 0-2是选择A套密码,4-6是B套密码

icdev := rf_init(sReaderComValue,115200); // 初始化串口
if icdev<0 then begin
Result:=-1;
rf_exit(icdev);
UWarningMsgBox('初试化IC卡失败');
exit;
end;

st:= rf_beep(icdev,10);
if st <>0 then begin
Result := -1;
rf_exit(icdev);
Exit;
end;

st:=rf_get_status(icdev,@status);
if st<>0 then begin
Result:=-1;
rf_exit(icdev);
UWarningMsgBox('请插入IC卡-->1');
exit;
end;
st:=rf_load_key_hex(icdev,loadmode,sector, 'ffffffffffff');
if st<>0 then begin
ShowMessage('load key error');
rf_exit(icdev);
Exit;
end;

st:=rf_card(icdev,1,@snr);
if st<>0 then begin
ShowMessage('rf_card error');
rf_exit(icdev);
Exit;
end;

st:=rf_authentication(icdev,loadmode,sector);
if st<>0 then begin
ShowMessage('rf_authentication error');
rf_exit(icdev);
Exit;
end;

st:=rf_write_hex(icdev,block,'A1A2A3A4A5A6A7A8A1A2A3A4A5A6A7A8');
if st<>0 then begin
ShowMessage('rf_write_hex error');
rf_exit(icdev);
Exit;
end;

st:=rf_check_writehex(icdev,snr,loadmode,block,'A1A2A3A4A5A6A7A8A1A2A3A4A5A6A7A8');
if st<>0 then begin
ShowMessage('rf_check_writehex error');
rf_exit(icdev);
Exit;
end;

st:=rf_write_hex(icdev,block+3,'ffffffffffffff078069ffffffffffff'); //写密码,当控制字节为默认值'FF 07 80 69'时,核对KEYB是无效的,改为'7F 07 88 69'时,可用KEYB。
if st<>0 then begin
ShowMessage('rf_write_hex error');
rf_exit(icdev);
Exit;
end;

st:=rf_read_hex(icdev,block,@s);
if st<>0 then begin
ShowMessage('rf_read_hex error');
rf_exit(icdev);
Exit;
end;

st:=rf_halt(icdev);
if st<>0 then begin
ShowMessage('load key error');
rf_exit(icdev);
Exit;
end;

st:=rf_reset(icdev,10);
if st<>0 then begin
ShowMessage('load key error');
rf_exit(icdev);
Exit;
end;

rf_exit(icdev);

程序我跟踪了,发现只要一到"Exit"后就会提示这个错误!有劳高人指点迷津!!
...全文
1516 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
software_thp 2011-10-31
  • 打赏
  • 举报
回复
我看看好嗎
cranley 2008-11-17
  • 打赏
  • 举报
回复
你写的例子如果是按钮事件响应函数中直接调用的话,不存在出入栈,所以不出错。如果把调用放入别的方法,然后按钮的事件响应函数再调用,这时肯定出错。
cranley 2008-11-17
  • 打赏
  • 举报
回复
不用想,是函数调用的出入栈问题。
如果是调用DLL的话,对应一下调用约定。
C++的_declspec 对应cdecl
manfredliu 2008-11-13
  • 打赏
  • 举报
回复
我刚才又试了一下,专门写了一个例子,然后把例子里面的步骤和我程序里的步骤一致,例子没错,程序有错!郁闷了
僵哥 2008-11-13
  • 打赏
  • 举报
回复
那应该是其它原因。
manfredliu 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 unsigned 的回复:]
icdev := rf_init(sReaderComValue,115200); // 初始化串口
if icdev <0 then begin
Result:=-1;
rf_exit(icdev); //初始化失败了,这里还怎么释放?释放什么东西?
UWarningMsgBox('初试化IC卡失败');
exit;
end;
[/Quote]

这个地方是个问题,但是现在问题不是出现这步,我故意在rf_load_hex()这个地方让他出错,然后想跳出程序,就是老报错
僵哥 2008-11-13
  • 打赏
  • 举报
回复
icdev := rf_init(sReaderComValue,115200); // 初始化串口
if icdev <0 then begin
Result:=-1;
rf_exit(icdev); //初始化失败了,这里还怎么释放?释放什么东西?
UWarningMsgBox('初试化IC卡失败');
exit;
end;
manfredliu 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 unsigned 的回复:]
初始化了接口,在哪里释放?
[/Quote]

rf_exit(icdev) //释放串口
manfredliu 2008-11-13
  • 打赏
  • 举报
回复
在补充一下,我这个单元本身是放在一个DLL里的,现在的结构就是一个EXE挂了一个DLL1,然后这个DLL1又挂了一个DLL2。两个DLL是放在一个目录下的,如果不是的话打开DLL1就会提示DLL2不存在。

我用断点一步一步走了,其实在这个错误之前还有一个小错误,我觉得没有关系,因为在明华给的实例程序里也会出现这个错误,现在是不是这个错误的问题,不好说~

附:错误的提示:Project SMStdCtrl.exe raised exception class EExternalException with message'External exception C0000008'.

和明华RF35射频卡读卡器自带的DEMO程序的错误一致
僵哥 2008-11-13
  • 打赏
  • 举报
回复
初始化了接口,在哪里释放?
panrongzeng 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 manfredliu 的回复:]
对。任何一步错了之后都这样
[/Quote]
我这边操作是不会出现这种情况的,可能断点看到出错然后指标指向exit,其实是上一步出错了
你看看你的接口dll放适合位置没有,可能是没找着dll
manfredliu 2008-11-13
  • 打赏
  • 举报
回复
补充代码(单元文件的文件头):
unit Udll;

interface

uses Windows,Sysutils,Dialogs,dbtables,StrUtils,YLE300_API;

var icdev:integer;

const
progtype='';
menchar: array[1..10] of integer = (1, 2, 3, 4, 5, 3, 1, 2, 4, 5);
MAX_CZKVALUE=99999;
MIN_CZKVALUE=0;

function VerifyCard(var cardno,AccountNo :string;var total :real;down:char) :integer ;//验证卡 -1:失败; 0:新卡; 1:回收卡; 2:使用卡有金额
function readcard(var cardno,AccountNo :string;var total :real;down:char) :integer ;//-1 失败 0:作废卡 1:正常卡
function checksum(var str:string;len:integer;Flag:char):char; //校验和 Flag='1' 付给str最后字符校验和。
function checkCsum(var str:string;len:integer;Flag:char):string; //磁卡写卡时加校验位
function WriteCard(Flag:char;CardNo,AccountNo:string;total:real) :boolean ;
function CheckKeyCard:boolean ; //开户和充值时需校验密匙卡

const cardtype=42;
addr=0;
len=64;
KeyMima:array[0..5]of char='CB2002';
// URF35
function add_s(i: smallint): smallint; stdcall;
far;external 'mwrf32.dll' name 'add_s';
{comm function.}
function rf_init(port: smallint;baud:longint): longint; stdcall;
far;external 'mwrf32.dll' name 'rf_init';
function rf_exit(icdev: longint):smallint;stdcall;
far;external 'mwrf32.dll'name 'rf_exit';
function rf_encrypt(key:pchar;ptrsource:pchar;msglen:smallint;ptrdest:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_encrypt';
function rf_decrypt(key:pchar;ptrsource:pchar;msglen:smallint;ptrdest:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_decrypt';
//
function rf_card(icdev:longint;mode:smallint;snr:pChar):smallint;stdcall;
far;external 'mwrf32.dll'name 'rf_card';
function rf_load_key(icdev:longint;mode,secnr:smallint;nkey:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_load_key';
function rf_load_key_hex(icdev:longint;mode,secnr:smallint;nkey:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_load_key_hex';
function rf_authentication(icdev:longint;mode,secnr:smallint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_authentication';
//
function rf_read(icdev:longint;adr:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_read';
function rf_read_hex(icdev:longint;adr:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_read_hex';
function rf_write(icdev:longint;adr:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_write';
function rf_write_hex(icdev:longint;adr:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_write_hex';
function rf_halt(icdev:longint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_halt';
function rf_reset(icdev:longint;msec:smallint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_reset';
//M1 CARD
function rf_initval(icdev:longint;adr:smallint;value:longint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_initval';
function rf_readval(icdev:longint;adr:smallint;value:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_readval';
function rf_increment(icdev:longint;adr:smallint;value:longint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_increment';
function rf_decrement(icdev:longint;adr:smallint;value:longint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_decrement';
function rf_restore(icdev:longint;adr:smallint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_restore';
function rf_transfer(icdev:longint;adr:smallint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_transfer';
function rf_check_write(icdev,snr:longint;adr,authmode:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_check_write';
function rf_check_writehex(icdev,snr:longint;adr,authmode:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_check_writehex';

//M1 CARD HIGH FUNCTION
function rf_HL_initval(icdev:longint;mode:smallint;secnr:smallint;value:longint;snr:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_HL_initval';
function rf_HL_increment(icdev:longint;mode:smallint;secnr:smallint;value,snr:longint;svalue,ssnr:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_HL_increment';
function rf_HL_decrement(icdev:longint;mode:smallint;secnr:smallint;value:longint;snr:longint;svalue,ssnr:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_HL_decrement';
function rf_HL_write(icdev:longint;mode,adr:smallint;ssnr,sdata:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_HL_write';
function rf_HL_read(icdev:longint;mode,adr:smallint;snr:longint;sdata,ssnr:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_HL_read';
function rf_changeb3(icdev:longint;secnr:smallint;keyA:pchar;B0,B1,B2,B3,Bk:smallint;KeyB:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_changeb3'; //修改密码

function rf_get_status(icdev:longint;status:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_get_status';
function rf_beep(icdev:longint;time:smallint):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_beep';
function rf_swr_eeprom(icdev:longint;offset,len:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_swr_eeprom';
function rf_srd_eeprom(icdev:longint;offset,len:smallint;data:pchar):smallint;stdcall;
far;external 'mwrf32.dll' name 'rf_srd_eeprom';

下面就是读卡和写卡过程了,读卡过程的主体是第一次帖出来的代码
僵哥 2008-11-13
  • 打赏
  • 举报
回复
建议把代码贴全。应该是某些自动释放的对象(特别是接口Interface一类的)可能存在释放先后逻辑顺序错误问题。
manfredliu 2008-11-13
  • 打赏
  • 举报
回复
对。任何一步错了之后都这样
fangsp 2008-11-13
  • 打赏
  • 举报
回复
程序里那么多Exit
是每个Exit都这样吗?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧