1. 程式人生 > 其它 >DELPHI 呼叫標準C介面DLL char *value

DELPHI 呼叫標準C介面DLL char *value

 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