【问题标题】:How to use ftrScanAPI.dll in Delphi如何在 Delphi 中使用 ftrScanAPI.dll
【发布时间】:2016-09-14 22:09:21
【问题描述】:

我在如何正确使用 ftrScanAPI.dll 方面遇到问题。在 DLL 中调用函数“ftrScanOpenDevice”时没有出现错误,但在调用过程“ftrScanCloseDevice”时出现“访问冲突”错误。我被卡住了,不知道我是否走在正确的轨道上。我做得对吗?

TProcedure = procedure; stdcall;
TProcedure_int = procedure(A_Int : Integer); stdcall;


  TFutronicFingerPrint = class
    fHandle : THandle;
    public
      constructor Create;
      destructor Destroy; override;
      procedure Open;
      procedure Close;
  end;

constructor TFutronicFingerPrint.Create;
begin
    inherited;
    fHandle := LoadLibrary('ftrScanAPI.dll');
end;

destructor TFutronicFingerPrint.Destroy;
begin
  FreeLibrary(fHandle);
  inherited;
end;

procedure TFutronicFingerPrint.Open;
var
  procOpenDevice : TProcedure;
begin

    @procOpenDevice := GetProcAddress(fHandle, 'ftrScanOpenDevice');
    if @procOpenDevice <> nil then
    begin
       procOpenDevice;
    end;
end;

procedure TFutronicFingerPrint.Close;
var
  proc : TProcedure_int;
begin

    @proc := GetProcAddress(fHandle, 'ftrScanCloseDevice');
    if @proc <> nil then
    begin
       proc(fHandle);
    end;
end;

【问题讨论】:

  • 您是否希望我们通过 Google 追踪 DLL,研究其文档以找到函数的声明,然后编写 Pascal 包装器,以便我们可以测试您的代码以了解它为什么不工作吗?
  • 不过,我将使用我的通灵调试技能:我敢打赌,对 ftpScanOpenDevice 的调用实际上是一个函数,它返回您刚刚打开的设备的整数句柄,并且您应该将该句柄传递给ftrScanCloseDevice 调用。将 DLL 句柄传递给过程是没有任何意义的。
  • @KenWhite:正是它的作用。 ftrScanOpenDevice() 返回 FTRHANDLE 作为输出,ftrScanCloseDevice() 然后将其作为输入。
  • @Remy:很明显,ftrScanCloseDevice 在关闭时不会期望它所在的 DLL 的句柄。从逻辑上讲,这没有任何意义。我希望在调用与 DLL 交互的所有其他函数时也需要返回 FTRHANDLE
  • @KenWhite:大多数是的。

标签: delphi dll


【解决方案1】:

问题是您声明和使用了错误的 DLL 函数。

ftpScanOpenevice() 不是一个过程,它是一个返回 FTRHANDLE 作为输出的函数。

ftrScanCloseDevice() 然后将 FTRHANDLE 作为输入,NOT 指向加载的 DLL 本身的 THandle

试试这个:

type
  FTRHANDLE = Pointer;
  ftrScanOpenDeviceFunc = function: FTRHANDLE; stdcall;
  ftrScanCloseDeviceFunc = procedure(ftrHandle: FTRHANDLE); stdcall;
  ...

  TFutronicFingerPrint = class
  private
    fHandle : THandle;
    fDevice : FTRHANDLE;
    procOpenDevice : ftrScanOpenDeviceFunc;
    procCloseDevice : ftrScanCloseDeviceFunc;
  public
    constructor Create;
    destructor Destroy; override;
    function Open: Boolean;
    procedure Close;
  end;

constructor TFutronicFingerPrint.Create;
begin
  inherited;

  fHandle := LoadLibrary('ftrScanAPI.dll');
  if fHandle = 0 then RaiseLastOSError;

  @procOpenDevice := GetProcAddress(fHandle, 'ftrScanOpenDevice');
  if not Assigned(procOpenDevice) then RaiseLastOSError;

  @procCloseDevice := GetProcAddress(fHandle, 'ftrScanCloseDevice');
  if not Assigned(procCloseDevice) then RaiseLastOSError;
end;

destructor TFutronicFingerPrint.Destroy;
begin
  Close;
  if fHandle <> 0 then
    FreeLibrary(fHandle);
  inherited;
end;

function TFutronicFingerPrint.Open: Boolean;
begin
  Close;
  fDevice := procOpenDevice();
  Result := fDevice <> nil;
end;

procedure TFutronicFingerPrint.Close;
begin
  if fDevice <> nil then
  begin
    procCloseDevice(fDevice);
    fDevice = nil;
  end;
end;

或者:

type
  FTRHANDLE = Pointer;

  TFutronicFingerPrint = class
  private
    fDevice : FTRHANDLE;
  public
    constructor Create;
    destructor Destroy; override;
    function Open: Boolean;
    procedure Close;
  end;

...

function ftrScanOpenDevice: FTRHANDLE; stdcall; external 'ftrScanAPI.dll';
procedure ftrScanCloseDevice(ftrHandle: FTRHANDLE); stdcall; external 'ftrScanAPI.dll';
...

constructor TFutronicFingerPrint.Create;
begin
  inherited;
end;

destructor TFutronicFingerPrint.Destroy;
begin
  Close;
  inherited;
end;

function TFutronicFingerPrint.Open: Boolean;
begin
  Close;
  fDevice := ftrScanOpenDevice();
  Result := fDevice <> nil;
end;

procedure TFutronicFingerPrint.Close;
begin
  if fDevice <> nil then
  begin
    ftrScanCloseDevice(fDevice);
    fDevice = nil;
  end;
end;

如果你得到一份ftrScanAPI.h 的副本,它包含实际的C 声明,可以翻译成Delphi,例如:

unit ftrScanAPI;

interface

uses
  Windows; 

type
  FTRHANDLE = Pointer; 

const
  FTR_MAX_INTERFACE_NUMBER = 128;

  FTR_OPTIONS_CHECK_FAKE_REPLICA = $00000001;
  FTR_OPTIONS_FAST_FINGER_DETECT_METHOD = $00000002;

  FTR_ERROR_BASE = $20000000;

  FTR_ERROR_EMPTY_FRAME = 4306 { ERROR_EMPTY }; 
  FTR_ERROR_MOVABLE_FINGER = FTR_ERROR_BASE or $0001;
  FTR_ERROR_NO_FRAME = FTR_ERROR_BASE or $0002;
  FTR_ERROR_USER_CANCELED = FTR_ERROR_BASE or $0003;
  FTR_ERROR_HARDWARE_INCOMPATIBLE = FTR_ERROR_BASE or $0004;
  FTR_ERROR_FIRMWARE_INCOMPATIBLE = FTR_ERROR_BASE or $0005;
  FTR_ERROR_INVALID_AUTHORIZATION_CODE = FTR_ERROR_BASE or $0006;

  FTR_CONST_COLOR_SMALL_IMAGE_WIDTH = 256;
  FTR_CONST_COLOR_SMALL_IMAGE_HEIGHT = 150;
  FTR_CONST_COLOR_SMALL_IMAGE_SIZE = FTR_CONST_COLOR_SMALL_IMAGE_WIDTH * FTR_CONST_COLOR_SMALL_IMAGE_HEIGHT;

  FTR_CONST_CALIBRATION_SKIP_IR = $00000001;
  FTR_CONST_CALIBRATION_SKIP_FUZZY = $00000002;

  FTR_CONST_DIODE_OFF: Byte = 0; 
  FTR_CONST_DIODE_ON: Byte = 255; 

  _FTRSCAN_IMAGE_SIZE = packed record
    nWidth: Integer;
    nHeight: Integer;
    nImageSize: Integer;
  end;
  FTRSCAN_IMAGE_SIZE = _FTRSCAN_IMAGE_SIZE;
  PFTRSCAN_IMAGE_SIZE = ^_FTRSCAN_IMAGE_SIZE; 

  _FTRSCAN_FAKE_REPLICA_PARAMETERS = packed record
    bCalculated: BOOL;
    nCalculatedSum1: Integer;
    nCalculatedSumFuzzy: Integer; 
    nCalculatedSumEmpty: Integer;
    nCalculatedSum2: Integer;
    dblCalculatedTremor: Double;
    dblCalculatedValue: Double;
  end;
  FTRSCAN_FAKE_REPLICA_PARAMETERS = _FTRSCAN_FAKE_REPLICA_PARAMETERS;
  PFTRSCAN_FAKE_REPLICA_PARAMETERS = ^_FTRSCAN_FAKE_REPLICA_PARAMETERS;

  _FTRSCAN_FRAME_PARAMETERS = packed record
    nContrastOnDose2: Integer;
    nContrastOnDose4: Integer; 
    nDose: Integer;
    nBrightnessOnDose1: Integer;
    nBrightnessOnDose2: Integer;
    nBrightnessOnDose3: Integer;
    nBrightnessOnDose4: Integer;
    FakeReplicaParams: FTRSCAN_FAKE_REPLICA_PARAMETERS;
    Reserved: array[0..64-SizeOf(FTRSCAN_FAKE_REPLICA_PARAMETERS)-1] of Byte;
  end;
  FTRSCAN_FRAME_PARAMETERS = _FTRSCAN_FRAME_PARAMETERS;
  PFTRSCAN_FRAME_PARAMETERS = ^_FTRSCAN_FRAME_PARAMETERS;

  __FTRSCAN_INTERFACE_STATUS = (
    FTRSCAN_INTERFACE_STATUS_CONNECTED, 
    FTRSCAN_INTERFACE_STATUS_DISCONNECTED 
  );
  FTRSCAN_INTERFACE_STATUS = __FTRSCAN_INTERFACE_STATUS;
  PFTRSCAN_INTERFACE_STATUS = ^__FTRSCAN_INTERFACE_STATUS;

  __FTRSCAN_INTERFACES_LIST = packed record
    InterfaceStatus: array[0..FTR_MAX_INTERFACE_NUMBER-1] of FTRSCAN_INTERFACE_STATUS;
  end;
  FTRSCAN_INTERFACES_LIST = __FTRSCAN_INTERFACES_LIST;
  PFTRSCAN_INTERFACES_LIST = ^__FTRSCAN_INTERFACES_LIST;

function ftrScanOpenDevice: FTRHANDLE; stdcall; 
function ftrScanOpenDeviceOnInterface(nInterface: Integer): FTRHANDLE; stdcall;
procedure ftrScanCloseDevice(ftrHandle: FTRHANDLE); stdcall; 
function ftrScanSetOptions(ftrHandle: FTRHANDLE; dwMask, dwFlags: DWORD): BOOL; stdcall; 
function ftrScanGetOptions(ftrHandle: FTRHANDLE; lpdwFlags: LPDWORD): BOOL; stdcall;

function ftrScanGetInterfaces(pInterfaceList: PFTRSCAN_INTERFACES_LIST): BOOL; stdcall;
function ftrSetBaseInterface(nBaseInterface: Integer): BOOL; stdcall;
function ftrGetBaseInterfaceNumber: Integer; stdcall;

function ftrScanGetFakeReplicaInterval(pdblMinFakeReplicaValue, pdblMaxFakeReplicaValue: PDouble): BOOL; stdcall;
procedure ftrScanSetFakeReplicaInterval(dblMinFakeReplicaValue, dblMaxFakeReplicaValue: Double); stdcall;

function ftrScanGetImageSize(ftrHandle: FTRHANDLE; pImageSize: PFTRSCAN_IMAGE_SIZE): BOOL; stdcall;
function ftrScanGetImage(ftrHandle: FTRHANDLE; nDose: Integer; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetFuzzyImage(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetBacklightImage(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetDarkImage(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetColourImage(ftrHandle: FTRHANDLE; pDoubleSizeBuffer: Pointer): BOOL; stdcall;
function ftrScanGetSmallColourImage(ftrHandle: FTRHANDLE; pSmallBuffer: Pointer): BOOL; stdcall;
function ftrScanGetColorDarkImage(ftrHandle: FTRHANDLE; pDoubleSizeBuffer: Pointer): BOOL; stdcall;

function ftrScanIsFingerPresent(ftrHandle: FTRHANDLE; pFrameParameters: PFTRSCAN_FRAME_PARAMETERS): BOOL; stdcall;
function ftrScanGetFrame(ftrHandle: FTRHANDLE; pBuffer: Pointer; pFrameParameters: PFTRSCAN_FRAME_PARAMETERS): BOOL; stdcall;

function ftrScanSave7Bytes(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanRestore7Bytes(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;

type
  PFTRCALIBRATEFNCB = function(pContext, pParams: Pointer): BOOL; cdecl;

function ftrScanZeroCalibration(pfnCallbackProc: PFTRCALIBRATEFNCB; pContext: Pointer): BOOL; stdcall; 
function ftrScanZeroCalibration2(dwOptions: DWORD; pfnCallbackProc: PFTRCALIBRATEFNCB; pContext: Pointer): BOOL; stdcall;
function ftrScanGetCalibrationConstants(ftrHandle: FTRHANDLE; pbyIRConst, pbyFuzzyConst: PByte): BOOL; stdcall;
function ftrScanStoreCalibrationConstants(ftrHandle: FTRHANDLE; byIRConst, byFuzzyConst: Byte; bBurnInFlash: BOOL): BOOL; stdcall;
function ftrScanGetFakeReplicaParameters(ftrHandle: FTRHANDLE; pFakeReplicaParams: PFTRSCAN_FAKE_REPLICA_PARAMETERS): BOOL; stdcall;

function ftrScanSetNewAuthorizationCode(ftrHandle: FTRHANDLE; pSevenBytesAuthorizationCode: Pointer): BOOL; stdcall;
function ftrScanSaveSecret7Bytes(ftrHandle: FTRHANDLE; pSevenBytesAuthorizationCode, pBuffer: Pointer): BOOL; stdcall;
function ftrScanRestoreSecret7Bytes(ftrHandle: FTRHANDLE; pSevenBytesAuthorizationCode, pBuffer: Pointer): BOOL; stdcall; 

function ftrScanSetDiodesStatus(ftrHandle: FTRHANDLE; byGreenDiodeStatus, byRedDiodeStatus: Byte): BOOL; stdcall;
function ftrScanGetDiodesStatus(ftrHandle: FTRHANDLE; pbIsGreenDiodeOn, pbIsRedDiodeOn: PBOOL): BOOL; stdcall;

implementation

const
  ftrScanAPI = 'ftrScanAPI.dll';

function ftrScanOpenDevice; external ftrScanAPI;

function ftrScanOpenDeviceOnInterface; external ftrScanAPI;
procedure ftrScanCloseDevice; external ftrScanAPI;
function ftrScanSetOptions; external ftrScanAPI;
function ftrScanGetOptions; external ftrScanAPI;

function ftrScanGetInterfaces; external ftrScanAPI;
function ftrSetBaseInterface; external ftrScanAPI;
function ftrGetBaseInterfaceNumber; external ftrScanAPI;

function ftrScanGetFakeReplicaInterval; external ftrScanAPI;
procedure ftrScanSetFakeReplicaInterval; external ftrScanAPI;

function ftrScanGetImageSize; external ftrScanAPI;
function ftrScanGetImage; external ftrScanAPI;
function ftrScanGetFuzzyImage; external ftrScanAPI;
function ftrScanGetBacklightImage; external ftrScanAPI;
function ftrScanGetDarkImage; external ftrScanAPI;
function ftrScanGetColourImage; external ftrScanAPI;
function ftrScanGetSmallColourImage; external ftrScanAPI;
function ftrScanGetColorDarkImage; external ftrScanAPI;

function ftrScanIsFingerPresent; external ftrScanAPI;
function ftrScanGetFrame; external ftrScanAPI;

function ftrScanSave7Bytes; external ftrScanAPI;
function ftrScanRestore7Bytes; external ftrScanAPI;

function ftrScanZeroCalibration; external ftrScanAPI;
function ftrScanZeroCalibration2; external ftrScanAPI;
function ftrScanGetCalibrationConstants; external ftrScanAPI;
function ftrScanStoreCalibrationConstants; external ftrScanAPI;
function ftrScanGetFakeReplicaParameters; external ftrScanAPI;

function ftrScanSetNewAuthorizationCode; external ftrScanAPI;
function ftrScanSaveSecret7Bytes; external ftrScanAPI;
function ftrScanRestoreSecret7Bytes; external ftrScanAPI;

function ftrScanSetDiodesStatus; external ftrScanAPI;
function ftrScanGetDiodesStatus; external ftrScanAPI;

end.

uses
  ..., ftrScanAPI;

  TFutronicFingerPrint = class
  private
    fDevice : FTRHANDLE;
  public
    constructor Create;
    destructor Destroy; override;
    function Open: Boolean;
    procedure Close;
  end;

...

constructor TFutronicFingerPrint.Create;
begin
  inherited;
end;

destructor TFutronicFingerPrint.Destroy;
begin
  Close;
  inherited;
end;

function TFutronicFingerPrint.Open: Boolean;
begin
  Close;
  fDevice := ftrScanOpenDevice();
  Result := fDevice <> nil;
end;

procedure TFutronicFingerPrint.Close;
begin
  if fDevice <> nil then
  begin
    ftrScanCloseDevice(fDevice);
    fDevice = nil;
  end;
end;

【讨论】:

  • 你打败了我(而且做得比我好得多)。 :-)
  • 非常感谢..我会在测试后更新内容
  • @KenWhite - 啊,但你的绝地心灵调试技能同样令人印象深刻。
  • ERROR_EMPTY 语句中出现错误。这句话应该出现在哪里?
  • @MenandroNeto ERROR_EMPTY 是 Win32 错误代码。如果您的Windows 单元未声明它,则必须手动声明该值。我已经根据this versionftrScanAPI.h 更新了声明
【解决方案2】:

关注变化:

unit UftrScanAPI;

interface

uses
  Windows;

type
  FTRHANDLE = Pointer;

const
  FTR_MAX_INTERFACE_NUMBER = 128;

  FTR_OPTIONS_CHECK_FAKE_REPLICA = $00000001;
  FTR_OPTIONS_FAST_FINGER_DETECT_METHOD = $00000002;

  FTR_ERROR_BASE = $20000000;
  ERROR_EMPTY = FTR_ERROR_BASE;
  FTR_ERROR_EMPTY_FRAME = ERROR_EMPTY;
  FTR_ERROR_MOVABLE_FINGER = FTR_ERROR_BASE or $0001;
  FTR_ERROR_NO_FRAME = FTR_ERROR_BASE or $0002;
  FTR_ERROR_USER_CANCELED = FTR_ERROR_BASE or $0003;
  FTR_ERROR_HARDWARE_INCOMPATIBLE = FTR_ERROR_BASE or $0004;
  FTR_ERROR_FIRMWARE_INCOMPATIBLE = FTR_ERROR_BASE or $0005;
  FTR_ERROR_INVALID_AUTHORIZATION_CODE = FTR_ERROR_BASE or $0006;

  FTR_CONST_COLOR_SMALL_IMAGE_WIDTH = 256;
  FTR_CONST_COLOR_SMALL_IMAGE_HEIGHT = 150;
  FTR_CONST_COLOR_SMALL_IMAGE_SIZE = FTR_CONST_COLOR_SMALL_IMAGE_WIDTH * FTR_CONST_COLOR_SMALL_IMAGE_HEIGHT;

  FTR_CONST_CALIBRATION_SKIP_IR = $00000001;
  FTR_CONST_CALIBRATION_SKIP_FUZZY = $00000002;

  FTR_CONST_DIODE_OFF: Byte = 0;
  FTR_CONST_DIODE_ON: Byte = 255;

type
  _FTRSCAN_IMAGE_SIZE = packed record
    nWidth: Integer;
    nHeight: Integer;
    nImageSize: Integer;
  end;
  FTRSCAN_IMAGE_SIZE = _FTRSCAN_IMAGE_SIZE;
  PFTRSCAN_IMAGE_SIZE = ^_FTRSCAN_IMAGE_SIZE;

  _FTRSCAN_FAKE_REPLICA_PARAMETERS = packed record
    bCalculated: BOOL;
    nCalculatedSum1: Integer;
    nCalculatedSumFuzzy: Integer; 
    nCalculatedSumEmpty: Integer;
    nCalculatedSum2: Integer;
    dblCalculatedTremor: Double;
    dblCalculatedValue: Double;
  end;
  FTRSCAN_FAKE_REPLICA_PARAMETERS = _FTRSCAN_FAKE_REPLICA_PARAMETERS;
  PFTRSCAN_FAKE_REPLICA_PARAMETERS = ^_FTRSCAN_FAKE_REPLICA_PARAMETERS;

  _FTRSCAN_FRAME_PARAMETERS = packed record
    nContrastOnDose2: Integer;
    nContrastOnDose4: Integer;
    nDose: Integer;
    nBrightnessOnDose1: Integer;
    nBrightnessOnDose2: Integer;
    nBrightnessOnDose3: Integer;
    nBrightnessOnDose4: Integer;
    FakeReplicaParams: FTRSCAN_FAKE_REPLICA_PARAMETERS;
    Reserved: array[0..64-SizeOf(FTRSCAN_FAKE_REPLICA_PARAMETERS)-1] of Byte;
  end;
  FTRSCAN_FRAME_PARAMETERS = _FTRSCAN_FRAME_PARAMETERS;
  PFTRSCAN_FRAME_PARAMETERS = ^_FTRSCAN_FRAME_PARAMETERS;

  __FTRSCAN_INTERFACE_STATUS = (
    FTRSCAN_INTERFACE_STATUS_CONNECTED, 
    FTRSCAN_INTERFACE_STATUS_DISCONNECTED 
  );
  FTRSCAN_INTERFACE_STATUS = __FTRSCAN_INTERFACE_STATUS;
  PFTRSCAN_INTERFACE_STATUS = ^__FTRSCAN_INTERFACE_STATUS;

  __FTRSCAN_INTERFACES_LIST = packed record
    InterfaceStatus: array[0..FTR_MAX_INTERFACE_NUMBER-1] of FTRSCAN_INTERFACE_STATUS;
  end;
  FTRSCAN_INTERFACES_LIST = __FTRSCAN_INTERFACES_LIST;
  PFTRSCAN_INTERFACES_LIST = ^__FTRSCAN_INTERFACES_LIST;

function ftrScanOpenDevice: FTRHANDLE; stdcall; 
function ftrScanOpenDeviceOnInterface(nInterface: Integer): FTRHANDLE; stdcall;
procedure ftrScanCloseDevice(ftrHandle: FTRHANDLE); stdcall; 
function ftrScanSetOptions(ftrHandle: FTRHANDLE; dwMask, dwFlags: DWORD): BOOL; stdcall; 
function ftrScanGetOptions(ftrHandle: FTRHANDLE; lpdwFlags: LPDWORD): BOOL; stdcall;

function ftrScanGetInterfaces(pInterfaceList: PFTRSCAN_INTERFACES_LIST): BOOL; stdcall;
function ftrSetBaseInterface(nBaseInterface: Integer): BOOL; stdcall;
function ftrGetBaseInterfaceNumber: Integer; stdcall;

function ftrScanGetFakeReplicaInterval(pdblMinFakeReplicaValue, pdblMaxFakeReplicaValue: PDouble): BOOL; stdcall;
procedure ftrScanSetFakeReplicaInterval(dblMinFakeReplicaValue, dblMaxFakeReplicaValue: Double); stdcall;

function ftrScanGetImageSize(ftrHandle: FTRHANDLE; pImageSize: PFTRSCAN_IMAGE_SIZE): BOOL; stdcall;
function ftrScanGetImage(ftrHandle: FTRHANDLE; nDose: Integer; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetFuzzyImage(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetBacklightImage(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetDarkImage(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanGetColourImage(ftrHandle: FTRHANDLE; pDoubleSizeBuffer: Pointer): BOOL; stdcall;
function ftrScanGetSmallColourImage(ftrHandle: FTRHANDLE; pSmallBuffer: Pointer): BOOL; stdcall;
function ftrScanGetColorDarkImage(ftrHandle: FTRHANDLE; pDoubleSizeBuffer: Pointer): BOOL; stdcall;

function ftrScanIsFingerPresent(ftrHandle: FTRHANDLE; pFrameParameters: PFTRSCAN_FRAME_PARAMETERS): BOOL; stdcall;
function ftrScanGetFrame(ftrHandle: FTRHANDLE; pBuffer: Pointer; pFrameParameters: PFTRSCAN_FRAME_PARAMETERS): BOOL; stdcall;

function ftrScanSave7Bytes(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;
function ftrScanRestore7Bytes(ftrHandle: FTRHANDLE; pBuffer: Pointer): BOOL; stdcall;

type
  PFTRCALIBRATEFNCB = function(pContext, pParams: Pointer): BOOL; cdecl;

function ftrScanZeroCalibration(pfnCallbackProc: PFTRCALIBRATEFNCB; pContext: Pointer): BOOL; stdcall; 
function ftrScanZeroCalibration2(dwOptions: DWORD; pfnCallbackProc: PFTRCALIBRATEFNCB; pContext: Pointer): BOOL; stdcall;
function ftrScanGetCalibrationConstants(ftrHandle: FTRHANDLE; pbyIRConst, pbyFuzzyConst: PByte): BOOL; stdcall;
function ftrScanStoreCalibrationConstants(ftrHandle: FTRHANDLE; byIRConst, byFuzzyConst: Byte; bBurnInFlash: BOOL): BOOL; stdcall;
function ftrScanGetFakeReplicaParameters(ftrHandle: FTRHANDLE; pFakeReplicaParams: PFTRSCAN_FAKE_REPLICA_PARAMETERS): BOOL; stdcall;

function ftrScanSetNewAuthorizationCode(ftrHandle: FTRHANDLE; pSevenBytesAuthorizationCode: Pointer): BOOL; stdcall;
function ftrScanSaveSecret7Bytes(ftrHandle: FTRHANDLE; pSevenBytesAuthorizationCode, pBuffer: Pointer): BOOL; stdcall;
function ftrScanRestoreSecret7Bytes(ftrHandle: FTRHANDLE; pSevenBytesAuthorizationCode, pBuffer: Pointer): BOOL; stdcall; 

function ftrScanSetDiodesStatus(ftrHandle: FTRHANDLE; byGreenDiodeStatus, byRedDiodeStatus: Byte): BOOL; stdcall;
function ftrScanGetDiodesStatus(ftrHandle: FTRHANDLE; pbIsGreenDiodeOn, pbIsRedDiodeOn: PBOOL): BOOL; stdcall;

implementation

const
  ftrScanAPI = 'ftrScanAPI.dll';

function ftrScanOpenDevice; external ftrScanAPI;

function ftrScanOpenDeviceOnInterface; external ftrScanAPI;
procedure ftrScanCloseDevice; external ftrScanAPI;
function ftrScanSetOptions; external ftrScanAPI;
function ftrScanGetOptions; external ftrScanAPI;

function ftrScanGetInterfaces; external ftrScanAPI;
function ftrSetBaseInterface; external ftrScanAPI;
function ftrGetBaseInterfaceNumber; external ftrScanAPI;

function ftrScanGetFakeReplicaInterval; external ftrScanAPI;
procedure ftrScanSetFakeReplicaInterval; external ftrScanAPI;

function ftrScanGetImageSize; external ftrScanAPI;
function ftrScanGetImage; external ftrScanAPI;
function ftrScanGetFuzzyImage; external ftrScanAPI;
function ftrScanGetBacklightImage; external ftrScanAPI;
function ftrScanGetDarkImage; external ftrScanAPI;
function ftrScanGetColourImage; external ftrScanAPI;
function ftrScanGetSmallColourImage; external ftrScanAPI;
function ftrScanGetColorDarkImage; external ftrScanAPI;

function ftrScanIsFingerPresent; external ftrScanAPI;
function ftrScanGetFrame; external ftrScanAPI;

function ftrScanSave7Bytes; external ftrScanAPI;
function ftrScanRestore7Bytes; external ftrScanAPI;

function ftrScanZeroCalibration; external ftrScanAPI;
function ftrScanZeroCalibration2; external ftrScanAPI;
function ftrScanGetCalibrationConstants; external ftrScanAPI;
function ftrScanStoreCalibrationConstants; external ftrScanAPI;
function ftrScanGetFakeReplicaParameters; external ftrScanAPI;

function ftrScanSetNewAuthorizationCode; external ftrScanAPI;
function ftrScanSaveSecret7Bytes; external ftrScanAPI;
function ftrScanRestoreSecret7Bytes; external ftrScanAPI;

function ftrScanSetDiodesStatus; external ftrScanAPI;
function ftrScanGetDiodesStatus; external ftrScanAPI;

end.

【讨论】:

  • 真的有必要发布这个包含我 3 年前发布的相同代码的答案吗?您所做的只是更改单元名称并添加 ERROR_EMPTY 声明,它甚至没有使用正确的值。如果您对我的代码有疑问,您可以发表评论。
  • 你忘了说,常量ERROR_EMPTY的值是多少?
  • 没有。这已在我的答案中的代码更新中得到解决。
【解决方案3】:

我仍在编写代码。实现动态加载dll:

unit UClinicAllFtrScanAPI;

interface

uses
  Classes, Windows, SysUtils;

type
  // API Futronic
  FTRHANDLE = Pointer;

  _FTRSCAN_FAKE_REPLICA_PARAMETERS = packed record
    bCalculated: BOOL;
    nCalculatedSum1: Integer;
    nCalculatedSumFuzzy: Integer;
    nCalculatedSumEmpty: Integer;
    nCalculatedSum2: Integer;
    dblCalculatedTremor: Double;
    dblCalculatedValue: Double;
  end;
  FTRSCAN_FAKE_REPLICA_PARAMETERS = _FTRSCAN_FAKE_REPLICA_PARAMETERS;
  PFTRSCAN_FAKE_REPLICA_PARAMETERS = ^_FTRSCAN_FAKE_REPLICA_PARAMETERS;

  _FTRSCAN_FRAME_PARAMETERS = packed record
    nContrastOnDose2: Integer;
    nContrastOnDose4: Integer;
    nDose: Integer;
    nBrightnessOnDose1: Integer;
    nBrightnessOnDose2: Integer;
    nBrightnessOnDose3: Integer;
    nBrightnessOnDose4: Integer;
    FakeReplicaParams: FTRSCAN_FAKE_REPLICA_PARAMETERS;
    Reserved: array[0..64-SizeOf(FTRSCAN_FAKE_REPLICA_PARAMETERS)-1] of Byte;
  end;
  FTRSCAN_FRAME_PARAMETERS = _FTRSCAN_FRAME_PARAMETERS;
  PFTRSCAN_FRAME_PARAMETERS = ^_FTRSCAN_FRAME_PARAMETERS;

  _FTRSCAN_IMAGE_SIZE = packed record
    nWidth: Integer;
    nHeight: Integer;
    nImageSize: Integer;
  end;
  FTRSCAN_IMAGE_SIZE = _FTRSCAN_IMAGE_SIZE;
  PFTRSCAN_IMAGE_SIZE = ^_FTRSCAN_IMAGE_SIZE;

  // Methods from dll

  TFutronicSDKIsFingerPresent = function (ftrHandle: FTRHANDLE; pFrameParameters: PFTRSCAN_FRAME_PARAMETERS): BOOL; stdcall;
  TFutronicSDKOpenDevice = function: FTRHANDLE; stdcall;
  TFutronicSDKCloseDevice = procedure (ftrHandle: FTRHANDLE); stdcall;
  TFutronicSDKSetDiodesStatus = function (ftrHandle: FTRHANDLE; byGreenDiodeStatus, byRedDiodeStatus: Byte): BOOL; stdcall;
  TFutronicSDKGetDiodesStatus = function(ftrHandle: FTRHANDLE; pbIsGreenDiodeOn, pbIsRedDiodeOn: PBOOL): BOOL; stdcall;
  TFutronicSDKGetImageSize = function(ftrHandle: FTRHANDLE; pImageSize: PFTRSCAN_IMAGE_SIZE): BOOL; stdcall;
  TFutronicSDKGetImage = function(ftrHandle: FTRHANDLE; nDose: Integer; pBuffer: Pointer): BOOL; stdcall;

  TClinicAllFutronicScanAPI = class(TComponent)
  private
    FDLLHandle: THandle;              // dll Handle
    FDevice: FTRHANDLE;

    FConnected: boolean;
    FLastReturn: integer;

    FIsFingerPresent: TFutronicSDKIsFingerPresent;
    FOpenDevice: TFutronicSDKOpenDevice;
    FCloseDevice: TFutronicSDKCloseDevice;
    FSetDiodesStatus: TFutronicSDKSetDiodesStatus;
    FGetDiodesStatus: TFutronicSDKGetDiodesStatus;
    FGetImageSize: TFutronicSDKGetImageSize;
    FGetImage: TFutronicSDKGetImage;

    function GetConnected: boolean;
  public
    constructor Create(AOwner: TComponent); reintroduce;
    destructor Destroy; reintroduce;
    procedure Free; overload;

    function Open: Boolean;
    procedure Close;
  published
    property Connected: boolean read GetConnected default false;
    property LastReturn: integer read FLastReturn default -1;
  end;

implementation

const
  DLL_FtrScanAPI = 'ftrScanAPI.dll';

{ TClinicAllFutronicScanAPI }

constructor TClinicAllFutronicScanAPI.Create(AOwner: TComponent);
begin
  FDLLHandle := LoadLibrary(DLL_FtrScanAPI);
  if FDLLHandle <> 0 then
  begin
    @FIsFingerPresent   := GetProcAddress(FDLLHandle, 'ftrScanIsFingerPresent');
    @FOpenDevice        := GetProcAddress(FDLLHandle, 'ftrScanOpenDevice');
    @FCloseDevice       := GetProcAddress(FDLLHandle, 'ftrScanCloseDevice');
    @FSetDiodesStatus   := GetProcAddress(FDLLHandle, 'ftrScanSetDiodesStatus');
    @FGetDiodesStatus   := GetProcAddress(FDLLHandle, 'ftrScanGetDiodesStatus');
    @FGetImageSize      := GetProcAddress(FDLLHandle, 'ftrScanGetImageSize');
    @FGetImage          := GetProcAddress(FDLLHandle, 'ftrScanGetImage');
  end
  else
    raise Exception.CreateFmt('Biblioteca dinâmica não encontrada %s!', [DLL_FtrScanAPI]);

  inherited Create(AOwner);
end;

destructor TClinicAllFutronicScanAPI.Destroy;
begin
  inherited Destroy;
end;

procedure TClinicAllFutronicScanAPI.Free;
begin
  if Assigned(self.FDevice) then
    self.FCloseDevice(self.FDevice);

  FreeLibrary(FDLLHandle);

  inherited Free;
end;

function TClinicAllFutronicScanAPI.GetConnected: boolean;
begin
  result := FConnected;
end;

function TClinicAllFutronicScanAPI.Open: Boolean;
begin
  Close;
  fDevice := self.FOpenDevice;
  FConnected := fDevice <> nil;
  Result := FConnected;
end;

procedure TClinicAllFutronicScanAPI.Close;
begin
  if fDevice <> nil then
  begin
    FCloseDevice(fDevice);
    fDevice := nil;
  end;
end;

end.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2014-08-24
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多