Создание шаблона цифрового отпечатка персоны из сериализованных данных

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

Я импортировал библиотеки DigitalPersona sdk dll как библиотеки типов в 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.

Все способы создания DPFPTemplate, похоже, включают только использование самого считывателя отпечатков пальцев.

Вот один из способов, который не работает

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

и вот еще

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

person Peter Turner    schedule 22.10.2009    source источник
comment
Не могли бы вы вывести какой-нибудь код, чтобы помочь нам понять?   -  person ChrisBD    schedule 22.10.2009
comment
Хорошая идея, спасибо, что заглянули.   -  person Peter Turner    schedule 22.10.2009
comment
Что такое ErrorCode (HRESULT), который возвращает EOleException? И, как говорит ChrisBD, дайте код.   -  person The_Fox    schedule 22.10.2009
comment
Код ошибки = -2147352568, это не имело большого смысла, но я попытался поймать EOleException, и в сообщении говорилось «Неверный тип переменной». Может быть, я передаю в эту функцию что-то не то. процедура Deserialize(RawData: OleVariant); Он должен принимать двоичные данные и генерировать объект шаблона отпечатка пальца, по которому я могу проверить другой отпечаток пальца.   -  person Peter Turner    schedule 22.10.2009
comment
Хорошо, спасибо комментаторам, чуваки. Я думаю, что ошибка на самом деле возникает из-за того, что я передаю в функцию Deserialize. «Плохой тип переменной» Теперь мне нужно выяснить, как получить хорошие данные.   -  person Peter Turner    schedule 22.10.2009
comment
-2147352568 = 0x80020008 = Неверный тип переменной. Какой тип ожидает TDPFPTemplate.Deserialize и какой тип AUserFinREcPtr.FingerBuffer? А какая у вас версия Delphi?   -  person The_Fox    schedule 22.10.2009
comment
При использовании Delphi 7 AUserFinRecPtr.FingerBuffer является PAnsiChar.   -  person Peter Turner    schedule 22.10.2009
comment
Функция десериализации ожидает что-то типа OleVariant.   -  person Peter Turner    schedule 22.10.2009


Ответы (1)


Я нашел документ в формате 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);
person The_Fox    schedule 22.10.2009