Pregunta

Esta es una pregunta muy específica que probablemente me gane la insignia de tumbleweed, pero responda si puede

He importado DigitalPersona sdk dll's como bibliotecas de tipos en Delphi y estoy tratando de verificar las huellas dactilares que he almacenado como datos serializados en una base de datos, está funcionando muy bien. La inscripción parece funcionar bien, pero no puedo volver a convertir los datos binarios de las huellas dactilares en objetos DPFPTemplate. Sigo obteniendo una OLEException cada vez que trato de usar la propiedad de interfaz predeterminada de un objeto TDPFPTemplate.

Lo que me pregunto es cómo Digital Persona espera que uses su SDK para recrear las huellas digitales. Esto es lo que dicen sus instrucciones:

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.

Todas las formas de hacer una Plantilla DPFP parecen incluir solo el uso del lector de huellas digitales.

Aquí hay una manera que no funciona

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

y aquí hay otro

DPFPTemplate := TDPFPTemplate.Create(nil);
DPFPTemplate.DefaultInterface.Deserialize(String(AUserFinREcPtr.FingerBuffer));
¿Fue útil?

Solución

Encontré un documento pdf en el que el método Deserialize está compuesto por una matriz de bytes. Su FingerBuffer es un PAnsiChar, que es una matriz de bytes. Pero luego lo convierte en una cadena que se convierte automáticamente en una OleString (Delphi convierte una cadena en una OleString cuando la asigna a un OleVariant). Así que ya no tienes una matriz de bytes.

Lo que puedes intentar hacer (no lo garantizo :)):

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top