代码之家  ›  专栏  ›  技术社区  ›  Peter Turner

从序列化数据创建数字角色指纹模板

  •  2
  • Peter Turner  · 技术社区  · 15 年前

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

    我已经将DigitalPersonasdkdll的a s-type库导入Delphi,并试图验证我在数据库中作为序列化数据存储的指纹,它的工作非常出色。注册似乎工作正常,但我无法将指纹中的二进制数据转换回dpfptemplate对象。每次尝试使用TDPFPTemplate对象的DefaultInterface属性时,我都会得到一个oleException。

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

    1. *Retrieve serialized fingerprint template data from a fingerprint data storage subsystem.
    2. Deserialize a DPFPTemplate object by calling the Deserialize method (VB page 40, C++
    page 83).
    3. Return a DPFPTemplate object.
    

    制作DPFP模板的所有方法似乎只包括使用指纹阅读器本身。

    有一种方法不管用

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

    这是另一个

    DPFPTemplate := TDPFPTemplate.Create(nil);
    DPFPTemplate.DefaultInterface.Deserialize(String(AUserFinREcPtr.FingerBuffer));
    
    1 回复  |  直到 12 年前
        1
  •  2
  •   The_Fox    15 年前

    我发现了一个PDF文档,其中反序列化方法被限定为一个字节数组。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);