//下面都是IC.dll内的代码。但是有工作不正常的现象,希望大家给找找原因。//IC卡密码读取
function ICReadIC(Addr,AddrCpu:smallint;Len:integer):Pchar;
var
lsSrc,lsDes:Array[0..16] of char;
lsReciveData:String;
Pass: string;
i,j:integer;
begin
for j:=low(lsSrc) to high(lsSrc) do
begin
lsSrc[j]:=#0;
lsDes[j]:=#0;
end;
Result :='';
//fillchar(lsSrc,16,SIZEOF(CHAR));
//fillchar(lsDes,16,SIZEOF(CHAR));
if(IsCpu=1) then
begin
ReadEF('$'+IntToHex(AddrCpu,2));
if((CpuCommand.lsSW1<>'90') and (CpuCommand.lsSW2<>'00')) then
begin
raise Error.Create('读取IC卡数值时发生错误!');
end;
move(CpuCommand.lsReciveData[4],lsSrc1,CpuCommand.lsReciveData[2]-3);
end
else
begin
if srd_4428(ICDEV,Addr,Len,lsSrc1) <>0 then
begin
raise Error.Create('读取IC卡数值时发生错误!');
end;
end; if (ic_decrypt('abcdefgh',lsSrc,Len,lsDes)<>0) then //DES解密
begin
raise Error.Create('数据解密时发生错误!');
end
else
begin
Result:=PChar(ByteArrayToStr(lsDes));
Exit;
end;
end;//-------上面的Result:=返回的Pchar内容为什么第一次提取时可以正常返回密码如:'9999'
//-------但是连续测数多了,就会发生返回值错乱的现象,如:返回'9999'但是外围接收后。就变了。
function ICCheckPwd(Addr:integer;Pwd:String;Len:integer):integer;
var
lsICPwd:String;
begin
lsICPwd:=Trim(ICReadIC(Addr,1,Len));
//这里前几次能够正常接收到密码'9999',但是次数多了。
//通过ICReadIC返回的密码'9999'等到lsICPwd接收时就
//发生了变化。此处已经跟踪调试时发现当ICReadIC返回
//密码'9999'后,在lsICPwd:=付值时内容发生了变化,变
//化内容随即。
if(lsICPwd<>Pwd) then
begin
raise Error.Create('IC卡用户密码错误,请仔细输入!');
end;
Result :=0;
end;
工作方式:
普通程序调用IC.dll
ICCheckPwd(1,'9999',16);
function ICReadIC(Addr,AddrCpu:smallint;Len:integer):Pchar;
var
lsSrc,lsDes:Array[0..16] of char;
lsReciveData:String;
Pass: string;
i,j:integer;
begin
for j:=low(lsSrc) to high(lsSrc) do
begin
lsSrc[j]:=#0;
lsDes[j]:=#0;
end;
Result :='';
//fillchar(lsSrc,16,SIZEOF(CHAR));
//fillchar(lsDes,16,SIZEOF(CHAR));
if(IsCpu=1) then
begin
ReadEF('$'+IntToHex(AddrCpu,2));
if((CpuCommand.lsSW1<>'90') and (CpuCommand.lsSW2<>'00')) then
begin
raise Error.Create('读取IC卡数值时发生错误!');
end;
move(CpuCommand.lsReciveData[4],lsSrc1,CpuCommand.lsReciveData[2]-3);
end
else
begin
if srd_4428(ICDEV,Addr,Len,lsSrc1) <>0 then
begin
raise Error.Create('读取IC卡数值时发生错误!');
end;
end; if (ic_decrypt('abcdefgh',lsSrc,Len,lsDes)<>0) then //DES解密
begin
raise Error.Create('数据解密时发生错误!');
end
else
begin
Result:=PChar(ByteArrayToStr(lsDes));
Exit;
end;
end;//-------上面的Result:=返回的Pchar内容为什么第一次提取时可以正常返回密码如:'9999'
//-------但是连续测数多了,就会发生返回值错乱的现象,如:返回'9999'但是外围接收后。就变了。
function ICCheckPwd(Addr:integer;Pwd:String;Len:integer):integer;
var
lsICPwd:String;
begin
lsICPwd:=Trim(ICReadIC(Addr,1,Len));
//这里前几次能够正常接收到密码'9999',但是次数多了。
//通过ICReadIC返回的密码'9999'等到lsICPwd接收时就
//发生了变化。此处已经跟踪调试时发现当ICReadIC返回
//密码'9999'后,在lsICPwd:=付值时内容发生了变化,变
//化内容随即。
if(lsICPwd<>Pwd) then
begin
raise Error.Create('IC卡用户密码错误,请仔细输入!');
end;
Result :=0;
end;
工作方式:
普通程序调用IC.dll
ICCheckPwd(1,'9999',16);
解决方案 »
- 求助:intraweb5.0播放视频的问题
- 怎样通过代码建立菜单项?
- 如何判断ADVStringGrid的cells里面的内容是否被修改了?
- 问一简单问题!!!!
- 怎样让String的容量大于255?
- 请问:如何在一个报表中打印两个表格(得到答案就给分)
- 怎样捕获系统提示消息?我想屏蔽系统消息,然后自定义一个提示!!!
- 上海的朋友搞个联议会吧,有兴趣的话进来签个名
- 〓〓〓〓 有何方法能实现窗体间的吸附功能? 〓〓〓〓
- NMPOP3控件很多事件里都有Handle,这个值的作用是什么?
- 请问谁做过[施耐德]AndOver continuum系统的开发或使用?
- 强烈抗议CSDN漠视DELPHI~~~~~~~~~~~`
你还是老老实实申请一个全局的 Array[0..16] of char 的密码变量,
把取得的密码copy到里面去,在用result指向这个变量来返回!
要管理好自己程序的内存
用完就free
一条管道里把垃圾推出去,有只怪兽在出口的地方张大嘴一口一口吃,如果后面没垃圾补上里面就是空的。。吃完一次这只怪兽就会饿死了
申请块内存去保存数据吧
全局 ReadValue: Pchar;Values:=ByteArrayToStr(lsDes1);其内部获得的字符传为''9999'#0#0#0#0''#4#0#0#0#0'
然后转换
ReadValue:=Pchar(Values);//用跟踪看他的值是'9999',但是其实他的值是nil,我通过中断后跟踪调试发现的。请大家帮我参谋参谋。怎么回事。
返回值指向的数据区谁来分配,谁来释放?
返回值指向的数据区能不能是局部变量?
楼主好好想想。
StrCopy的说明:
function StrCopy(Dest: PChar; const Source: PChar): PChar;DescriptionUse StrCopy to copy a null-terminated string. StrCopy does not perform any length checking. The destination buffer must have room for at least StrLen(Source)+1 characters.For length checking, use the StrLCopy function.