DELPHI 呼叫標準C介面DLL char *value
阿新 • • 發佈:2022-05-30
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