2009-10-22 2 views
2

Это очень конкретный вопрос, который, вероятно, заработать мне перекати значок, но ответьте, пожалуйста, если вы можетеСоздание цифрового шаблона персон отпечатка пальца из сериализованных данных

Я импортировал DigitalPersona DLL SDK, как библиотеки типов в 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)); 
+1

Не могли бы вы всплывал какой-то код, чтобы помочь дать нам ключ? – ChrisBD

+0

Хорошая идея, спасибо за lookin. –

+1

Что такое ErrorCode (HRESULT), возвращаемое EOleException? И, как говорит ChrisBD, дайте некоторый код. –

ответ

2

Я нашел документ в формате PDF, где метод Deserialize является feaded массив байтов. Ваш 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); 
+1

Ничего себе, это сработало, а не рушится хотя бы. Благодаря тонну! –