FUNCTION INT IC_Personal (INT FlagOp, ICC_ENV iccenv, REF ICC_Personal data) Library "iccinter.DLL"
这是PB的声明.icc_env,icc_personal是structor类型.
delphi里应该怎么写

解决方案 »

  1.   

    你的structor在delphi中也需要定义的
    ICC_ENV = record
       //--....
    end;ICC_Personal = record
       //--....
    end;//--
    function IC_Personal (FlagOp:Integer; iccenv:ICC_ENV;var data:ICC_Personal):Integer;
          stdcall;external 'iccinter.dll' name 'IC_Personal';
      

  2.   

    function IC_Personal(FlagOp:Integer;iccenv:ICC_ENV;var data:ICC_Personal):Integer;stdcall;external 'iccinter.dll';
      

  3.   

    还是出错,麻烦大家再帮我看看pb代码:
    FUNCTION INT IC_PIN (INT FlagOp, REF ICC_ENV iccenv, blob newPIN) Library "iccinter.DLL"
    FUNCTION INT IC_Personal (INT FlagOp, ICC_ENV iccenv, REF ICC_Personal data) Library "iccinter.DLL"icc_personal
    pin:string
    idcard:string
    name:string
    sex:string
    birth:string
    workdate:string
    retiredate:string
    salary:long
    annuity:long
    areacode:string
    companyid:string
    personaltype:long
    icc_env
    readertype:unsignedlong
    cardtype:unsignedlong
    port:
    baud:
    commdevice:
    timeout:
    pin:string
    key:sring
    hostaddr:string
    hosttimeout:unsignedlong
    cardsn:string
    optype:unsignedlong
    reserved[32]:character
    调用语句
    iccenv = gv_iccenvi = ic_opensession (iccenv)
    if i < 0 then
    ic_closesession (iccenv)
    f_testvalue (i)
    return -1
    end if//personal info
    iccpersonal.pin = space (100)
    iccpersonal.idcard = space (100)
    iccpersonal.name = space (100)
    iccpersonal.sex = space (100)
    iccpersonal.birth = space (100)
    iccpersonal.workdate = space (100)
    iccpersonal.retiredate = space (100)
    iccpersonal.areacode = space (100)
    iccpersonal.companyid = space (100)
    i = ic_personal (0, iccenv, iccpersonal)
    if i < 0 then
    ic_closesession (iccenv)
    f_testvalue (i)
    return -1
    end if我写的代码
    type
      Ticcenv = record
        ReaderType: Integer;
        CardType: Integer;
        Port: Integer;
        Baud: Integer;
        Commdevice: Integer;
        TimeOut: Integer;
        Pin: string;
        Key: string;
        Hostaddr: string;
        HosTimeOut: Integer;
        CardSn: string;
        opType: Integer;
        Reserved: array[0..31] of Char;
      end;  TICC_Personal = record
        Pin: string;
        IDCard: string;
        Name: string;
        Sex: string;
        Birth: string;
        WorkDate: string;
        RetireDate: string;
        Salary: Integer;
        Annuity: Integer;
        Areacode: string;
        Companyid: string;
        PersonalType: Integer;
      end;FUNCTION IC_OpenSession (var ICC_ENV: Ticcenv): Integer;stdcall;external 'iccinter.DLL';
    FUNCTION IC_CloseSession (var ICC_ENV: Ticcenv): Integer;stdcall;external 'iccinter.DLL';
    FUNCTION IC_Personal (FlagOp: Integer; ICC_ENV: Ticcenv; var ICC_Personal: TICC_Personal): Integer;stdcall;external 'iccinter.DLL';procedure TForm1.RzBitBtn1Click(Sender: TObject);
    begin
      Iccenv.CardType := 101;
      Iccenv.Pin := '000000';
      Iccenv.ReaderType := 101;
      Iccenv.Port := 1;
      Iccenv.Baud := 9600;
      Iccenv.TimeOut := 30000;
      Iccenv.HosTimeOut := 60000;
      Iccenv.Hostaddr := '10.71.172.151'; //...
      try
        if IC_OpenSession(Iccenv) < 0 then
          MessageBox(Handle,'Open Sessiion Error','Error',MB_OK)
        else begin
          iccPersonal.Pin := DupeString(' ',100);
          iccPersonal.IDCard := DupeString(' ',100);
          iccPersonal.Name := DupeString(' ',100);
          iccPersonal.Sex := DupeString(' ',100);
          iccPersonal.Birth := DupeString(' ',100);
          iccPersonal.WorkDate := DupeString(' ',100);
          iccPersonal.RetireDate := DupeString(' ',100);
          iccPersonal.Salary := 0;
          iccPersonal.Annuity := 0;
          iccPersonal.Areacode := DupeString(' ',100);
          iccPersonal.Companyid := DupeString(' ',100);
          iccPersonal.PersonalType := 0;
          if IC_Personal(0,Iccenv,iccPersonal) < 0 then//执行到这里出错,是读地址错误
            MessageBox(Handle,'Read Personal Error','Error',MB_OK)
          else
            Caption := iccPersonal.Pin;
        end;
      finally
        IC_CloseSession(Iccenv);
      end;
      

  4.   

    建议发到一个叫“程序员家园”的BBS上面,域名不太记得好象是www.tiantiansoft.com/bbs
    里面是PB高手。
      

  5.   

    呵呵,看上去像IC卡相关的代码。楼主需要注意几点:1. record代表了一块内存区域,而string只是一个指针(SizeOf(string) = 4)
    2. record默认是8字节对齐,如果按内存顺序存放(1字节对齐),需要使用packed record
    3. 函数调用规则,DLL里面一般用stdcall或cdecl
    4. 如果需要在EXE和DLL之间传递动态类型(如string,record),要同时引用ShareMeme.g. 
      TICC_Personal = packed record
        Pin: array[0..99] of Char;
        //...
      end;