//下面都是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);

解决方案 »

  1.   

    ByteArrayToStr,这个是什么函数???
    你还是老老实实申请一个全局的 Array[0..16] of char 的密码变量,
    把取得的密码copy到里面去,在用result指向这个变量来返回!
      

  2.   

    栈上分配的内存,在函数返回后,就被清除了。建议外部传进去一个buffer, 然后吧password复制到buffer中去。
      

  3.   

    楼上的说得有道理
    要管理好自己程序的内存
    用完就free
      

  4.   

    pchar是指针的,楼主知道汇编里是怎么读取数据的么?
    一条管道里把垃圾推出去,有只怪兽在出口的地方张大嘴一口一口吃,如果后面没垃圾补上里面就是空的。。吃完一次这只怪兽就会饿死了
    申请块内存去保存数据吧
      

  5.   

    有最新发现问题出现在:将String类型转换为Pchar类型私有 Values: String;
    全局 ReadValue: Pchar;Values:=ByteArrayToStr(lsDes1);其内部获得的字符传为''9999'#0#0#0#0''#4#0#0#0#0'
    然后转换
    ReadValue:=Pchar(Values);//用跟踪看他的值是'9999',但是其实他的值是nil,我通过中断后跟踪调试发现的。请大家帮我参谋参谋。怎么回事。
      

  6.   

    返回值是PChar,一看就知道有问题
    返回值指向的数据区谁来分配,谁来释放?
    返回值指向的数据区能不能是局部变量?
    楼主好好想想。
      

  7.   

    把array拷给pchar用delphi自带的StrCopy试试,像这样先转成String,在PChar()一下的作法好像有点乱
    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.
      

  8.   

    而且返回值做成pchar,在函数内部好像都不能分配空间和释放啊,要么就用String做返回值,用StrPas()函数来把数组拷给String。function StrPas(const Str: PChar): string;DescriptionThis function is provided for backwards compatibility only. To convert a null terminated string to a Pascal-type string, use a typecast or an assignment.