本人在应用IC卡接口函数APDU_Function进行CPU卡文件选择操作时得到oxff的返回值,提示信息为“读写器机具返回SW指示有错”,请问该如何处理才能得到正确的返回值?
   程序主要部分如下:   nResult:=HexStrToByte('00A400000200',addr(bReadWrite));
   cla:=bReadWrite[0];
   ins:=bReadWrite[1];
   p1:=bReadWrite[2];
   p2:=bReadWrite[3];
   lc:=bReadWrite[4];
   le:=bReadWrite[5];
   nResult:=HexStrToByte('DF01',addr(bReadWrite));
   nResult:=APDU_Function(cla,ins,p1,p2,lc,addr(bReadWrite),le,addr(Rece),addr(plen),delay);    要操作的文件标识符为“DF01”,当对MF文件操作时返回值正常。
    这一问题很急迫,恳请高手指点,本人将不胜感激。

解决方案 »

  1.   

    接口的函数声明 
      Function APDU_Function(cla:byte;ins:byte;p1:byte;p2:byte;lc:byte;data:pbytearray;le:byte;rdata:pbytearray;plen:PDWORD;delay:WORD):smallint; stdcall;external 'hxdxq32.dll';
      Function HexStrToByte(Str:String;rdata:pbytearray):smallint; stdcall;external 'hxdxq32.dll'; 向大龙驹请教该如何处理。
      

  2.   

    函数声明
    const
    string MYDLL;
    MYDLL: = " hxdxq32.dll";
    implementation
    Function LinkDevice(devicename:string):smallint; stdcall;external MYDLL;
    Function UnlinkDevice:smallint;stdcall;external MYDLL;
    Function PowerOn(slot:byte;recedata:pbytearray; plen:PDWORD):smallint; stdcall; external MYDLL;
    Function PowerOff(slot:byte;recedata:pbytearray;plen:PDWORD):smallint; stdcall; external MYDLL;
    Function ReadCard(zone,addr,len:DWORD;recedata:pbytearray;plen:PDWORD):smallint; stdcall;external MYDLL;
    Function WriteCard(zone,addr,len:DWORD;senddata,recedata:pbytearray; plen: PDWORD):smallint;stdcall;external MYDLL;
    Function ChkSecret(keytype:byte;key,recedata:pbytearray;plen:PDWORD):smallint; stdcall;external MYDLL;u 调用例子:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      nCom:string;
      i:smallint;
      bSecret:array[0..16] of byte;
      nResult:integer;
      bReadWrite,Rece:array[0..255] of byte;
      plen:DWORD;
    begin
      //打开设备
      bSecret[0]:=$ff;bSecret[1]:=$ff;
      nCom:=’COM1’;
      nResult:= LinkDevice (nCom);
      showmessage(IntToStr(nResult));
      nResult:=PowerOn(1,addr(bReadWrite),addr(plen));
      showmessage(IntToStr(nResult));
      //核对密码
      nResult:=ChkSecret(0,addr(bSecret),addr(bReadWrite),addr(plen));
      showmessage(IntToStr(nResult));
      //写卡
      for i:=0 to 255 do
        bReadWrite[i]:=i;
      nResult:=WriteCard(0,32,32,addr(bReadWrite),addr(Rece),addr(plen));
      showmessage(IntToStr(nResult));
      //读卡
      for i:=0 to 255 do bReadWrite[i]:=0;
      nResult:=ReadCard(0,0,80,addr(bReadWrite),addr(plen));
      showmessage(IntToStr(nResult));
      nResult:=PowerOff(1,addr(bReadWrite),addr(plen));
      showmessage(IntToStr(nResult));
      //关闭设备
      nResult:=UnlinkDevice;
      showmessage(IntToStr(nResult));
    end;  以上是IC卡读卡器随机手册上提供的参考示例,但只是对非CPU型IC卡的操作示例,两者之间有较大差别。
      

  3.   

    作进一步测试发现对文件标识符为“DF02”和的文件操作时返回值也正常,但对所有的EF文件操作均和“DF01”文件一样返回同样的值。
    请各位指点指点。
      

  4.   

    作进一步测试发现对文件标识符为“DF02”和“DF03”的文件操作时返回值也正常,但对所有的EF文件操作均和“DF01”文件一样返回同样的值。
    请各位指点指点。