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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章