你的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';
function IC_Personal(FlagOp:Integer;iccenv:ICC_ENV;var data:ICC_Personal):Integer;stdcall;external 'iccinter.dll';
还是出错,麻烦大家再帮我看看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;
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';
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;
里面是PB高手。
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;