这是一个非常具体的问题,可能会让我获得风滚草徽章,但如果可以,请回答
我已经将DigitalPersona sdk dll作为类型库导入到Delphi中,并且我正在尝试验证我作为序列化数据存储在数据库中的指纹,它的工作非常棒。注册似乎工作正常,但我无法将指纹中的二进制数据转换回DPFPTemplate对象。每次我尝试使用TDPFPTemplate对象的defaultinterface属性时,我都会一直收到OLEException。
我想知道的是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));
答案 0 :(得分:2)
我找到了一个pdf文档,其中Deserialize方法是一个字节数组。你的FingerBuffer是一个PAnsiChar,它是一个字节数组。但是然后你将它转换为一个自动转换为OleString的字符串(当你将它分配给OleVariant时,Delphi会将字符串转换为OleString)。所以你不再有一个字节数组了。
你可以尝试做什么(我不会保证:)):
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);