将C ++指针代码转换为delphi

时间:2012-04-19 21:31:53

标签: delphi unmanaged

这是我想从Delphi调用的C ++头文件中的一个函数:

 * @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
);

- Def

/** 
 * 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*);

2 个答案:

答案 0 :(得分: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_OPERATION的指针传递,我想它是struct。您需要为它声明匹配的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], ...);

我现在看到你在编辑中添加了结构定义。我会在这里留下我的结构,因为你应该能够自己转换这些结构。

答案 1 :(得分: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;