Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   OleVariant a campo blob (https://www.clubdelphi.com/foros/showthread.php?t=40025)

mdomeyko 05-02-2007 19:08:54

OleVariant a campo blob
 
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(const iVariant:OleVariant):string;

mdomeyko 05-02-2007 23:56:58

Olevariant a blob
 
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

Código Delphi [-]
q_upd.FieldByName('huella').asString := VarToStr(pTemplate);

mdomeyko 06-02-2007 18:22:08

Olevariant a campo blob
 
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.

Código Delphi [-]
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

Biometrics U2U DigitalPersona, D6, Firebird; RESUELTO!
 
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;
{==============================================================================}


La franja horaria es GMT +2. Ahora son las 15:26:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi