• 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
  • 相关阅读:
    英语常用口语
    单词记忆(3)
    电视制式及声音制式的划分
    单词记忆(2)
    单词记忆(1)
    低调做人 高调做事
    分析数据库死锁原因的方法
    详细查看数据库SQL执行计划
    如果查看数据库链接数
    刷新所有视图
  • 原文地址:https://www.cnblogs.com/zhqian/p/16325733.html
Copyright © 2020-2023  润新知