0

これは、Delphi から呼び出したい C++ ヘッダー ファイル内の関数の 1 つです。

 * @param hConnection Handle to the connection to FM.
 * @param pOperation See description of ABS_OPERATION.
 * @param dwTemplateCount Count of templates in the pTemplateArray.
 * @param pTemplateArray Pointer to the array of pointers to templates.
 * @param pResult Pointer to memory location, where result of the comparing 
 */
ABS_STATUS BSAPI ABSVerify(
    IN ABS_CONNECTION hConnection,
    IN ABS_OPERATION* pOperation,
    IN ABS_DWORD dwTemplateCount,
    IN ABS_BIR** pTemplateArray,
    OUT ABS_LONG* pResult,
    IN ABS_DWORD dwFlags
);

-- デフ

/** 
 * The header of the BIR. This type is equivalent to BioAPI's structure 
 * BioAPI_BIR_HEADER. 
 */
typedef struct abs_bir_header {
  ABS_DWORD Length;     ///< Length of Header + Opaque Data
  ABS_BYTE HeaderVersion;   ///< HeaderVersion = 1
  ABS_BYTE Type;    ///< Type = 4 (BioAPI_BIR_DATA_TYPE_PROCESSED)
  ABS_WORD FormatOwner;     ///< FormatOwner = 0x12 (STMicroelectronics)
  ABS_WORD FormatID;    ///< FormatID = 0
  ABS_CHAR Quality;     ///< Quality = -2 (BioAPI_QUALITY is not supported)
  ABS_BYTE Purpose;     ///< Purpose (BioAPI_PURPOSE_xxxx, ABS_PURPOSE_xxxx).
  ABS_DWORD FactorsMask;    ///< FactorsMask = 0x08 (BioAPI_FACTOR_FINGERPRINT)
} ABS_BIR_HEADER;

/** 
 * A container for biometric data. 
 */
typedef struct abs_bir {
  ABS_BIR_HEADER Header;    ///< BIR header
  ABS_BYTE Data[ABS_VARLEN];    ///< The data composing the fingerprint template.
} ABS_BIR;

  struct abs_operation;
typedef struct abs_operation ABS_OPERATION;  /* forward declaration */

/** 
 * A type of the callback function that an application can supply to 
 * the BSAPI to enable itself to display GUI state information to user. 
 * 
 * @param pOperation Pointer to ABS_OPERATION structure used when calling the interactive operation.
 * @param dwMsgID ID of message. See description of ABS_MSG_xxxx constants.
 * @param pMsgData Pointer to data with additional information related with 
 * the message. 
 */
typedef void (BSAPI  *ABS_CALLBACK) ( const ABS_OPERATION*, ABS_DWORD, void*);
4

2 に答える 2

2

おそらく次のようなものです。

function ABSVerify(
    hConnection: Integer;
    Operation: PABS_OPERATION;
    dwTemplateCount: DWORD;
    pTemplateArray: PPABS_BIR;
    var pResult: Integer;
    dwFlags: DWORD
): Integer; stdcall; external 'bsapi.dll';

少しぼやけているものはABS_OPERATION. それはINパラメーターですが、へのポインターとして渡されるためABS_OPERATIONstruct. 一致する Delphi レコードとそのポインタ型を宣言する必要があります。多分このように:

type
  ABS_OPERATION = record
    field1: Integer;
    field2: Integer;
    //etc.
  end;
  PABS_OPERATION = ^ABS_OPERATION;

注意が必要な他のパラメーターは次のpTemplateArrayとおりです。

pTemplateArray テンプレートへのポインターの配列へのポインター。

これはポインタの配列です。C の配列は、最初の要素へのポインターとして渡されます。したがって、ABS_BIR**それ自体が へのポインタである最初の要素へのポインタであるタイプ を説明しますABS_BIR

type
  ABS_BIR = ... //whatever it is
  PABS_BIR = ^ABS_BIR;
  PPABS_BIR = ^PABS_BIR;

この関数を次のように呼び出すことができます。

var
  TemplateArray: array of PABS_BIR;
...
  SetLength(TemplateArray, dwTemplateCount);
  // populate TemplateArray
  returnval := ABSVerify(..., dwTemplateCount, @TemplateArray[0], ...);

編集で構造体定義を追加したことがわかりました。これらの構造体は自分で変換できるはずなので、作成した構造体はここに残しておきます。

于 2012-04-19T21:46:34.987 に答える
1

何にBSAPI解決されるかを確認する必要があります。私は仮定していstdcallます:

type
  PABS_OPERATION = ^ABS_OPERATION;
  PABS_BIR = ^ABS_BIR;
  PPABS_BIR = ^PABS_BIR;
  PABS_LONG = ^ABS_LONG;

function ABSVerify( 
    hConnection: ABS_CONNECTION;
    pOperation: PABS_OPERATION;
    dwTemplateCount: ABS_DWORD;
    pTemplateArray: PPABS_BIR;
    pResult: PABS_LONG;
    dwFlags: ABS_DWORD
): ABS_STATUS; stdcall; 

または:

type
  PABS_BIR = ^ABS_BIR;

function ABSVerify( 
    hConnection: ABS_CONNECTION;
    var pOperation: ABS_OPERATION;
    dwTemplateCount: ABS_DWORD;
    var pTemplateArray: PABS_BIR;
    out pResult: ABS_LONG;
    dwFlags: ABS_DWORD
): ABS_STATUS; stdcall; 
于 2012-04-19T21:38:49.353 に答える