Создание цифрового шаблона отпечатка лица из сериализованных данных - PullRequest
2 голосов
/ 22 октября 2009

Это очень специфический вопрос, который, вероятно, принесет мне значок «паутина», но, пожалуйста, ответьте, если сможете

Я импортировал SDK DigitalPersona как библиотеки типов в Delphi и пытаюсь проверить отпечатки пальцев, которые я сохранил как сериализованные данные в базе данных, это работает очень хорошо. Кажется, регистрация работает нормально, но я не могу превратить двоичные данные из отпечатков пальцев обратно в объекты DPFPTemplate. Я продолжаю получать OLEException каждый раз, когда пытаюсь использовать свойство defaultinterface объекта TDPFPTemplate.

Мне интересно, как Digital Persona ожидает, что вы будете использовать их 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 Ответ

2 голосов
/ 22 октября 2009

Я нашел документ в формате pdf, где метод Deserialize превращается в байтовый массив. Ваш FingerBuffer - это PAnsiChar, который представляет собой массив байтов. Но затем вы преобразуете его в строку, которая автоматически преобразуется в OleString (Delphi преобразует строку в OleString при назначении ее для OleVariant). Таким образом, у вас больше нет массива байтов.

Что вы можете попробовать сделать (я не гарантирую :)):

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);
...