2012-04-19 119 views
0

这是C++头文件,我想从德尔福调用一个函数:转换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 
); 

- 防守

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

您需要出示'ABS_OPERATION'的定义和'ABS_BIR' – 2012-04-19 21:34:58

+0

我加入了高清 – Ezi 2012-04-19 21:42:36

+1

什么是你的问题?确保它是一般的兴趣。 [Stack Overflow是不是代码的翻译服务。(http://meta.stackexchange.com/a/129362/33732) – 2012-04-19 21:47:20

回答

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。现在

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

我看到你在编辑添加的结构定义:

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

你可以调用该函数是这样的。我会把我的结构留在这里,因为你应该能够自己转换这些结构。

+0

非常感谢您的努力。 – Ezi 2012-04-19 21:47:58

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;