2

这是一个非常具体的问题,可能会为我赢得风滚草徽章,但如果可以,请回答

我已经将 DigitalPersona sdk dll 作为类型库导入到 Delphi 中,并试图验证我作为序列化数据存储在数据库中的指纹,它的工作非常出色。注册似乎工作正常,但我无法将指纹中的二进制数据转换回 DPFPTemplate 对象。每次尝试使用 TDPFPTemplate 对象的 defaultinterface 属性时,我都会收到 OLEException。

我想知道的是 Digital Persona 希望您如何使用他们的 SDK 来重新创建指纹。他们的指示是这样说的:

1. *从指纹数据存储子系统中检索序列化的指纹模板数据。
2.通过调用Deserialize方法反序列化一个DPFPTemplate对象(VB第40页,C++
第 83 页)。
3. 返回一个 DPFPTemplate 对象。

制作 DPFPTemplate 的所有方法似乎只包括使用指纹读取器本身。

这是一种行不通的方法

 Result := CreateOleObject('DPFPShrX.DPFPTemplate.1') as IDPFPTemplate;
 Result.Deserialize(string(AUserFinRecPtr.FingerBuffer));

这是另一个

DPFPTemplate := TDPFPTemplate.Create(nil);
DPFPTemplate.DefaultInterface.Deserialize(String(AUserFinREcPtr.FingerBuffer));
4

1 回答 1

2

我找到了一个 pdf 文档,其中 Deserialize 方法是一个字节数组。您的 FingerBuffer 是一个 PAnsiChar,它是一个字节数组。但是然后你将它转换为一个字符串,该字符串会自动转换为 OleString(当你将字符串分配给 OleVariant 时,Delphi 会将字符串转换为 OleString)。所以你不再有字节数组了。

你可以尝试做什么(我不会保证:)):

var
  lByteArray: Variant;
  lArrayPointer: Pointer;
  lStr: AnsiString;
  DPFPTemplate: TDPFPTemplate;
begin
  lStr := AUserFinREcPtr.FingerBuffer;
  lByteArray := VarArrayCreate([0, Length(lStr) - 1], varByte );
  lArrayPointer:= VarArrayLock(lByteArray);
  try
    Move( lStr[1], lArrayPointer^, Length(lStr) );
  finally
    VarArrayUnlock(lByteArray);
  end;
  DPFPTemplate := TDPFPTemplate.Create(nil);
  DPFPTemplate.DefaultInterface.Deserialize(lByteArray);
于 2009-10-22T17:27:31.383 回答