PDA

Ver la Versión Completa : OleVariant a campo blob


mdomeyko
05-02-2007, 19:08:54
Estoy trabajando con la captura de huella digital y necesito grabar en un campo blob el resultado de la captura que es una variable Olevariant, pero no se como hacerlo... y despues tengo que hacer la operacion inversa... (blob a Olevariant)
Por favor ayudenme...:confused:

ArdiIIa
05-02-2007, 23:37:39
Bienvenido.... mira esta función y el resto del contenido....

function VariantBinaryToString (http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=remobjects.public.dataabstract&messageid=cklerh$nrm$1@linux.local)(const iVariant:OleVariant):string;

mdomeyko
05-02-2007, 23:56:58
Gracias Ardilla, pero no resulto.
1. No encuentro funcion "CheckVariant(iVariant); .. lo puse como comentarios.. no se que chequeo hara...:(

2. Me dio error "Variant is not an array" al ejecutar funcion..
q_upd.parambyname('huella').asblob := VariantBinaryToString(pTemplate);:(

ArdiIIa
06-02-2007, 02:53:14
Cambio de nota....
utiliza la función VarToStr de Unit Variants y lo metes en el blob como texto

q_upd.FieldByName('huella').asString := VarToStr(pTemplate);

mdomeyko
06-02-2007, 18:22:08
Gracias ardilla, pero tampoco funciona. Me da mismo error "invalid variant type error"..:(

ArdiIIa
06-02-2007, 19:00:54
Pues no se me ocurre nada más.
A lo mejor verificando el contenido de esa variable, que no esté vacía, paso a paso con el depurador...

jacanche
07-02-2007, 04:55:55
Que tipo de lector de huella digital usas?, yo tengo un Digital Persona U.are.U 4000, en el evento OnDone del componente que lee la huella le pongo el siguiente codigo.


procedure TfrmRegistrarHuella.FPRegisterTemplate1Done(Sender: TObject;
var pTemplate: OleVariant);
var
l_val : OleVariant;
l_pArray : PSafeArray;
i : integer;
fpBuffer : PByteArray;
MS : TMemoryStream;
begin
pTemplate.Export(l_val);
l_pArray := PSafeArray(TVarData(l_val).VArray);
blobSize := l_pArray.rgsabound[0].cElements * l_pArray.cbElements;
fpBuffer := VarArrayLock(l_val);


for i := 0 to blobSize - 1 do
fpData[i] := fpBuffer[i]; //pvData es byte array

VarArrayUnlock(l_val);
mode := 0;
Ms := TMemoryStream.Create;
Ms.WriteBuffer(fpData,blobsize);
tblPersonalHUELLA.LoadFromStream(MS); //Aqui guardo la huella en la base de datos
end;

Uso Delphi 6, firebird 1.5 y el sdk del lector

mdomeyko
08-02-2007, 00:08:43
OK, Lo resolvi con ayuda de varios. Graciasa ellos. Como resulto tan dificil, aca va mi experiencia de Registro y Verificacion... Suerte!;)

Para usuarios UrU DigitalPersona usando D6 & Firebird:

Registro de Huella (FingerPrint)

Procedure TfrmRegisterFingerPrint.FPRegisterTemplate1done(Sender: TObject; var pTemplate: OleVariant);
var l_val : OleVariant;
l_pArray : PSafeArray;
i : integer;
fpBuffer : PByteArray;
MS : TMemoryStream;
begin
pTemplate.Export(l_val);
l_pArray := PSafeArray(TVarData(l_val).VArray);
blobSize := l_pArray.rgsabound[0].cElements * l_pArray.cbElements;
fpBuffer := VarArrayLock(l_val);
for i := 0 to blobSize - 1 do
fpData[i] := fpBuffer[i]; // pvData is byte array
VarArrayUnlock(l_val);
mode := 0;
MS := TMemoryStream.Create; { creates stream }
MS.WriteBuffer(fpData, blobsize); { writes stream }
try
t_users.filtered := false; // TIBTable
t_users.filter := 'userid = ' + inttostr(gUserid); // the useer ID to assign the fingerprint
t_users.filtered := true;
t_usersopen;
t_users.edit;
TBlobField(t_users.fieldbyname('FingerPrint')).LoadFromStream(MS); // gets from stream
t_servers.post;
DMLogOn.IBTransac.commit;
except
DMLogOn.IBTransac.Rollback;
end;
t_users.close;
MS.free;
end;
{==============================================================================}

Verifying Huella (FingerPrint)

Procedure TfrmLogOn.FPGetTemplate1done(Sender: TObject; var pTemplate: OleVariant);
var i : integer; pErr : AIErrors;
begin
i := GetFingerID(pTemplate); // returns UserId
if i <> 0 then begin
bbOKClick(nil); // gets in whatever...
end
else if (gUsesFingerPrint) then begin // indicator that system can use fingerprint system
finger_image.Picture := nil; // cleans fingerprint image
FPGetTemplate1.Run(1,pErr); // runs again if fingerprint not found or until manual input...
end;
end;
{==============================================================================}

Function TfrmLogOn.GetFingerID(pTemplate : OleVariant): Integer;
var m_verifyOk : WordBool;
m_score : OleVariant;
m_security : AISecureModeMask;
m_threshold : OleVariant;
m_learning : WordBool;
m_tUnknown : IUnknown;
c_IVerify : ifPVerify;
c_regTemplate : ifPTemplate;
ST : TMemoryStream;
ExistingTemplate: OleVariant;
iCounter: Integer;
begin
m_learning := False;
m_verifyOk := False;
m_tUnknown := CreateComObject(CLASS_FPVerify);
m_tUnknown.QueryInterface(IID_ifPVerify,c_IVerify);
qrefresh(@q_users); // select userid, fingerprint from users.....
ST := TMemoryStream.Create;
Try
While NOT q_users.EOF do begin
ST.Clear;
TBlobField(q_users.FieldByName('FingerPrint')).SaveToStream(ST); // blob field from DB and store in memory stream
ExistingTemplate := MemoryStreamToOleVariant(ST); // convert to olevariant
m_tUnknown := CreateComObject(CLASS_FPTemplate);
m_tUnknown.QueryInterface(IID_ifPTemplate,c_RegTemplate);
c_regTemplate.Import(ExistingTemplate);
c_IVerify.Compare(c_RegTemplate,
pTemplate,
m_verifyOk,
m_score,
m_threshold,
m_learning,
m_security);
if m_verifyOk Then begin
Result := q_users.FieldByName('userid').AsInteger; // returns user ID
VarClear(ExistingTemplate);
Exit;
end;
VarClear(ExistingTemplate);
c_regTemplate := nil;
q_users.Next; // reads next user
end;
Finally;
ST.Free;
VarClear(pTemplate);
if c_regTemplate <> nil Then
c_regTemplate := nil;
c_IVerify := nil;
end;
end;
{==============================================================================}