如何使用DELPHI调用标准C接口DLL获取字符指针value?
- 内容介绍
- 文章标签
- 相关推荐
本文共计632个文字,预计阅读时间需要3分钟。
Delphi调用标准C接口DLL的`char*`类型参数,由于内部实现不同。无标准代码可用,需根据具体接口调整。手动记录,未完全验证。调用方式0,说明:`iReadM1Card`:函数。
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
本文共计632个文字,预计阅读时间需要3分钟。
Delphi调用标准C接口DLL的`char*`类型参数,由于内部实现不同。无标准代码可用,需根据具体接口调整。手动记录,未完全验证。调用方式0,说明:`iReadM1Card`:函数。
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

