delphi調用標準C接口DLL char * 的調用,因內部實現的不同。並無標準代碼可用,需要跟據接口實際情況來調整入參類型與格式。
隨手所記,並未全部驗證
調用方式0
申明
iReadM1Card:function(SecNr:Integer;DataBlock:Integer; SecKey:PAnsiChar;PwdType:Integer;pOutInfo:PAnsiChar):Integer;stdcall; var Errcode:Integer; ReadInfo:PAnsiChar; OutValue1: WideString; begin OutValue:=''; ReadInfo:=GetMemory(200); try Errcode:=iReadM1Card(1,0,'AA',0,ReadInfo) ; OutValue1:=StrPas(ReadInfo); if Errcode<0 then begin ...... Exit; end; OutValue:=leftstr(OutValue1,7) ;//取前7位 finally FreeMemory(ReadInfo); end;
申明格式1
interface uses SysUtils; const CallDLL='DC_Reader.dll'; var AERROR:STRING; {函數名稱:iReadM1Card 函數功能:通用讀M1卡 long __stdcall iReadM1Card(int SecNr, int DataBlock, char *SecKey, int PwdType, char *pOutInfo) 參數說明:[IN] SecNr 扇區編號(0~15) [IN] DataBlock 塊編號(0~3) [IN] SecKey 密鑰數據,爲空時默認“FFFFFFFFFFFF” [IN] PwdType 密鑰類型 0:0套Type-A, 4:0套Type-B 1:1套Type-A, 5:1套Type-B 2:2套Type-A, 6:2套Type-B [OUT] pchOutInfo 成功:數據信息 失敗:錯誤描述信息 返回值: 成功:返回0; 失敗:返回小於0的錯誤碼。} iReadM1Card:function(SecNr:Integer;DataBlock:Integer; SecKey:PAnsiChar;PwdType:Integer;var pOutInfo:PAnsiChar):Integer;stdcall;
通用動態DLL加載
var LibHandle:THandle; LibHandle := Loadlibrary(PChar(CallDLL) );//'DC_Reader.dll' if LibHandle <= 32 then begin AERROR := '加載動態鏈接庫'+CallDLL+'失敗,錯誤代碼:' + IntToStr(LibHandle); exit; end; try @iReadM1Card := GetProcAddress(LibHandle, PChar('iReadM1Card')); Result:=True; except on E:Exception do begin ......end; end;
調用方式1
var Errcode:Integer; ReadInfo:PAnsiChar; OutValue1: WideString; begin Result:=False; OutValue:=''; ReadInfo:=GetMemory(1000); try Errcode:=iReadM1Card(1,0,'AA',0,ReadInfo) ; OutValue1:=StrPas(ReadInfo); if Errcode<0 then begin ...... Exit; end; OutValue:=leftstr(OutValue1,7) ;/取前7位 finally FreeMemory(ReadInfo); end; Result:=True;
調用方式2
var Errcode:Integer;
P:Pointer;
buff:array[0..32] of Char;
begin
p:=AnsiStrAlloc(32);
ZeroMemory(@p,32);
Errcode:=iReadM1Card1(1,0,'AC14654634CA',0,p) ;
CopyMemory(@buff[0],p,32);
申明格式2 數組
iReadM1Card:function(SecNr:Integer;DataBlock:Integer; SecKey:PAnsiChar;PwdType:Integer;var pOutInfo:TBytes):Integer;stdcall;
調用格式2
var Errcode:Integer; ReadInfo:TBytes; OutValue, OutValue1: WideString; i:Integer; Begin OutValue:=''; SetLength(ReadInfo,32); try Errcode:=iReadM1Card(1,0,'AA',0,ReadInfo) ; for I := Low(ReadInfo) to High(ReadInfo) do begin OutValue1:=OutValue1 + Char(ReadInfo[i]); end; if Errcode<0 then begin Exit; end; OutValue:=leftstr(OutValue1,7) ;//取前7位 finally FreeMemory(ReadInfo); end; end