如何在Delphi

时间:2015-09-29 20:57:26

标签: delphi activex ole fingerprint delphi-xe6

我在尝试序列化DigitalPersona指纹模板时遇到了很大困难。我不知道自己做错了什么。我能够从与SDK一起分发的演示EXE中保存的文件中反序列化模板,并在我的应用程序中验证模板而不会出现此代码的问题

procedure TFMain.Button4Click(Sender: TObject);
var
  Blob: Array [0 .. 1632] of Byte;
  VarBlob: OleVariant;
  MyFile: File;
  P: Pointer;
  Teste: TDPFPTemplate;
begin
  // Read binary data from file.
  if OpenDialog1.Execute then
  begin
    AssignFile(MyFile, OpenDialog1.FileName);
    Reset(MyFile, 1632);
    BlockRead(MyFile, Blob, 1);
    CloseFile(MyFile);
    VarBlob := VarArrayCreate([0, Length(Blob) - 1], varByte);
    P := VarArrayLock(VarBlob);
    try
      Move(Blob[0], P^, Length(Blob));
    finally
      VarArrayUnlock(VarBlob);
    end;
    if not Assigned(Template) then
    begin
      Teste := TDPFPTemplate.Create(Self);
      Template := Teste.DefaultInterface;
      Template.Deserialize(VarBlob);
    end;
  end;

但是当我尝试序列化模板以保存到我的应用程序中的文件时,文件中写入的数据似乎与模板无关,因为我检查了文件内容并且它们非常非常不同在结构上。我所做的就是调用IDPFPTemplate接口的Serialize方法,因为它在SDK文档中被告知。但是,当我尝试使用我的应用程序生成的文件验证指纹时,无法验证指纹,因为该文件的内容无效。以下是序列化和保存文件的代码

procedure TFMain.Button3Click(Sender: TObject);
var
  MyFile: File;
  OleBlob: OleVariant;
  Blob: Array of Byte;
  uBound: Integer;
begin
  {Template is a global variable in the main form that is set by the
   enroll process, I can verify the template set by the enroll
   process, but I'm not able to record it and verify it later. The
   Serialize method returns an OleVariant containing an Array of
   Bytes}
  OleBlob := Template.Serialize;
  if VarArrayDimCount(OleBlob) = 1 then
  begin
    uBound := VarArrayHighBound(OleBlob, 1);
  end;

  if uBound < 0 then
    ShowMessage('Template vazio')
  else
  begin
    Blob := OleBlob;
    AssignFile(MyFile, 'c:\users\leandro\desktop\teste.txt');
    ReWrite(MyFile, 1632);
    BlockWrite(MyFile, Blob, 1);
    CloseFile(MyFile);
  end;
end;

请注意,模板的大小始终为1632字节,这就是我的数组长度为1632字节的原因。我在文件中记录数组内容或调用SDK的Serialize方法在文件中生成无效模板数据的方式是否有问题?

0 个答案:

没有答案