Mon problème est le suivant .
la fonction CapRawImageToHandle est définie dans le SDK avec les
paramètres suivants:
Returns a picture display handle (IPictureDisp) to the supplied raw
grayscale fingerprint image.
Return On success, GR_OK is returned.
On failure, the appropriate error code is returned.
Parameters
[in] rawImage A raw grayscale fingerprint image.
[in] width Fingerprint image width in pixels.
[in] height Fingerprint image height in pixels.
[in] hdc The device context handle (HDC) in which the picture will be
created.
[out] handle The fingerprint picture display handle (IPictureDisp).
Mon code windev est le suivant :
idsensor est une chaîne
moncontext, monhdc, monhandle sont des entiers
monimage est un Variant
ActiveX1>>CapInitialize()
ActiveX1>>Initialize()
ActiveX1>>CreateContext(moncontext)
ActiveXEvénement("montest",ActiveX1,"SensorPlug")
ActiveX1>>CapStartCapture(idsensor)
monhdc=dDébutDessin(Image1)
monhandle=Handle(Image1)
ActiveX1>>CapRawImageToHandle(monimage,355,390,monhdc,monhandle)
ActiveX1>>StopCapture(idsensor)
quand je teste, il me met l'erreur suivante :
" En tentant d'invoquer la méthode <CapRawImageToHandle>, l'objet
Automation/ActiveX a renvoyé l'erreur suivante : 'Erreur 80020005,
Type incorrect pour le paramètre 5' "
Quelqu'un a une idée?
Merci d'avance
Salut,
> [out] handle The fingerprint picture display handle (IPictureDisp).
-> C'est un paramètre en sortie...(donc rien à voir avec le handle du
champ image...)
Essaye avec :
ActiveX1>>CapRawImageToHandle(monimage,355,390,monhdc,&monhandle)
Et ensuite tu devrais avoir une valeur pour le handle qui te serviras
probalement pour la suite...
A+
--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)
idsensor est une chaîne
moncontext, monhdc,monhandle sont des entiers
monimage est un Variant
ActiveX1>>CapInitialize()
ActiveX1>>Initialize()
ActiveX1>>CreateContext(moncontext)
ActiveXEvénement("montest",ActiveX1,"SensorPlug")
ActiveX1>>CapStartCapture(idsensor)
monhdc=dDébutDessin(Image1)
//monhandle=Handle(Image1)
ActiveX1>>CapRawImageToHandle(monimage,355,390,monhdc,&monhandle)
// Affichage de la valeur du handle
Info(monhandle)
j'utilise une version trial du fingerprint SDK de griaule de 90 jours
Je ne sais pas si elle a des limites, ils n'en n'ont pas parlé dans
les docs. les fonctions d'initialisations me renvoient bien le code de
succès mais le lecteur ne s'allume pas. Quand j'essaie avec les
applications exemples venues avec l'SDK, pas de problème. Est-ce moi
qui initialise mal, ou d'où peut venir le problème?
Merci
En VB :
Function CapRawImageToHandle (ByRef RawImage As Object, ByVal width As
Integer, ByVal height As Integer, ByVal hdc As Integer, ByRef handler
As stdole.IPictureDisp) As Integer
Donc tu vois que "handler" est un type de données définie en amont...
--
Pascal ROY
(Service Informatique - SODALEC)
ou comme c'est un paramètre de sorti, je dois récupérer la valeur de
"monhandle" et l'affecter à un champ image?
> le type IPictureDisp par exemple, je ne sais pas à quoi il correspond
> en windev. j'ai l'impression que c'est un type OLE mais comment le
> définir pour qu'il fonctionne avec mon champ image "image1" par
> exemple.
La définition du IPictureDisp est ici :
http://msdn.microsoft.com/en-us/library/ms680762(VS.85).aspx
Tu dois donc utiliser une structure correspondante.
> j'ai essayé l'objet automation dynamique mais sans succès.
> Merci beaucoup Romain pour l'attention que tu portes au sujet. J'avais
> aussi quelques doutes sur le paramètre précédent (HDC) j'espère que je
> l'ai bien défini ?
En théorie, oui...
Dans la pratique, je crois avoir eu des souci avec l'hDC récupéré par
la fonction dDébutDessin pour l'utiliser ensuite avec des API (mais
bon, je suis toutjours en 7.5...)
Sinon, il faudra utiliser l'API GetWindowDC (si tu utiliser l'Hdc de la
fenetre) ou GetDC si tu utilises le champ.
http://msdn.microsoft.com/en-us/library/ms534830(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms533241(VS.85).aspx
(dans l'exemple VB6, c'est le hDC de la fenetre qui est utilisé)
Bon courage.
Merci
> Selon vous, rawimage peut être sous quel forme en windev ?
Tu devrais télécharger Visual Studio Express
http://www.microsoft.com/express/vb/default.aspx et charger le projet
exemple en C#...
En VB6, on trouve :
' Raw image data type.
Public Type rawImage
' Image data.
img As Variant
' Image width.
width As Long
' Image height.
height As Long
' Image resolution.
res As Long
End Type
Non, il y a méprise, il ne s'agit pas pour toi de reprendre le
développement en VB ou C#, il s'agit de pouvoir ouvrir les exemples du
SDK (qui n'existent pas en W-langage) afin de pouvoir plus facilement
les retranscrire sous WD (types de données, comment utiliser les
fonctions etc...)
<< Un élément de type ne peut pas être converti vers le type
variant.>>
Si au moins il précisait le type de la variable d'origine, je saurai
quoi mettre comme type à ma variable Param_image.
voici ma fonction de callback
PROCEDURE Aquisition_Image(Param_ID_Sensor="DPMS6C2DB4",
Param_Largeur=355,Param_image est un Variant=0 ,
Param_Hauteur=390,Param_res=96)
et mon évènement
ActiveXEvénement("Aquisition_Image",ActiveX1,"ImageAcquired")
ensuite il apparaît un message de sécurité windev.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Une erreur système inattendue est survenue.
Si cet incident se produit de manière systématique lorsque vous
exécutez les mêmes manipulations, il est conseillé de transmettre au
Support Technique Gratuit :
- une description des circonstances de l'incident
- les lignes de code, une fenêtre ou un projet permettant de
reproduire le problème
- les informations techniques suivantes
Détails techniques :
Module : ntdll.dll
Adresse de base : 7C910000
Erreur système : Access violation (GPF)
EIP = 7C928FEA
OS : Windows XP ou .NET Service Pack 2(5.1.2600)
**********************************************
Informations techniques
Dump de l'erreur du module <WD100VM.DLL> <10.00Mo>.
- Niveau : erreur fatale (EL_FATAL)
- Code erreur : 1020
- Code erreur WD55 : 0
- Pas de code d'erreur système
- Pas de message d'erreur système
- Que s'est-il passé ?
Une erreur système inattendue est survenue.
Si cet incident se produit de manière systématique lorsque vous
exécutez les mêmes manipulations, il est conseillé de transmettre au
Support Technique Gratuit :
- une description des circonstances de l'incident
- les lignes de code, une fenêtre ou un projet permettant de
reproduire le problème
- les informations techniques suivantes
Détails techniques :
Module : ntdll.dll
Adresse de base : 7C910000
Erreur système : Access violation (GPF)
EIP = 7C928FEA
OS : Windows XP ou .NET Service Pack 2(5.1.2600)
- Infos de debug :
Registres :
EIP = 7C928FEA EBP = 0012F9F4
EAX = 00000000 EBX = 00000000
ECX = 0000023C EDX = 01063244
ESI = 01063234 EDI = 00000000
Pile des appels :
[ntdll.dll (7C910000)] 7C928F8F : RtlpWaitForCriticalSection() + 91
bytes
- Pas d'info attachée
- Identifiant dans le .err : 1020
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Peut être que vous y verrez plus clair que moi.
Merci
vMaVariable est un variant
est-elle la solution ?
Il n'y aurait pas un paramètre de trop ?
' An image was acquired from reader
Private Sub GrFingerXCtrl1_ImageAcquired(ByVal idSensor As String,
ByVal width As Long, ByVal height As Long, rawImage As Variant, ByVal
res As Long)
ou plutot une inversion entre hauteur et rawimage ?
<a href="http://www.wdforge.org/modules/newbb/viewtopic.php?
post_id=20660">http://www.wdforge.org/modules/newbb/viewtopic.php?
post_id=20660</a>
J'ai essayé la solution dont il a parlé (choisir de passer par les dll
et non l'activeX) mais, l'appel d'une fonction dans la dll me renvoie
toujours que la fonction n'a pas été trouvé hors j'ai bien suivi la
syntaxe écrite dans la documentation de l'SDK, bref, peut être que les
messages du forum vous aideront à me guider sur mon problème de type
de variable.
Merci
> J'ai essayé la solution dont il a parlé (choisir de passer par les dll
> et non l'activeX) mais, l'appel d'une fonction dans la dll me renvoie
> toujours que la fonction n'a pas été trouvé hors j'ai bien suivi la
> syntaxe écrite dans la documentation de l'SDK, bref, peut être que les
> messages du forum vous aideront à me guider sur mon problème de type
> de variable.
La solution avec l'ActiveX semble difficile...
Tu as pris contact avec la personne qui semble avoir réussi à utiliser
la DLL ?
A+
J'ai répondu sans lire avec attention,
PROCEDURE Aquisition_Image(Param_ID_Sensor="DPMS6C2DB4",
Param_Largeur=355,Param_image est un Variant=0 ,
Param_Hauteur=390,Param_res=96)
A la place de "Param_image est un Variant=0", mettre "Param_image est
un Variant=null" ?
Pour le variant=null, toujours la même réponse
<< Un élément de type ne peut pas être converti vers le type
> variant.>>
Est-ce qu'il y a une possibilité de lire le contenu d'une dll, peut
être que c'est moi qui ne tapais pas correctement la fonction ou que
l'aide fournit avec l'SDK est erronée.
http://www.nirsoft.net/utils/dll_export_viewer.html
Là, je vais me mettre à utiliser la dll pour voir ce que sa va donner.
Une dernière question
Dans la dll, j'ai trouvé par exemple pour la fonction d'initialisation
Fonction Name Adress Relative Adress
_GrInitialize@0 0x10001010 0x10001010
et dans l'aide de l'SDK, je trouve pour la même fonction défini en C++
C++
int result;
//Initialize the library
result = GrInitialize();
ALors ma question est la suivante : comment sera la syntaxe en
windev .
Moi je pense à :
mavar, mavar2 sont des entiers
mavar=ChargeDLL("C:\Program Files\Griaule\Fingerprint SDK 2007\bin
\GrFinger.dll")
mavar2=AppelDLL32("GrFinger","_GrInitialize@0")
superbe sa marche.
Je n'ai pas vu les évènements dans la dll, l'aide de l'SDK dit qu'ils
sont sous forme de fonctions callback.
un exemple se présente comme suit :
Déclaration :
C++
typedef void CALLBACK GRCAP_STATUS_EVENT_PROC(char* idSensor,
GRCAP_STATUS_EVENTS event);
Sample Code
C++
void StatusEventHandler(char* idSensor, GRCAP_STATUS_EVENTS event) {
// Signaling that a Status Event occurred.
WriteEvent(idSensor, event);
if (event == GR_PLUG) {
// Start capturing from the plugged reader.
GrCapStartCapture(idSensor, myFingerCallBack, myImageCallBack);
} else if (event == GR_UNPLUG) {
// Stop capturing from the unplugged reader
GrCapStopCapture(idSensor);
}
}
Si je comprend bien, je dois créer une procédure StatusEventHandler ou
plutôt GRCAP_STATUS_EVENT_PROC;
si c'est le cas, ou pourrais-je trouver la fonction StatusEventHandler
car elle n'est dans aucune des dll fournit.
Merci encore pour votre aide.
PROCEDURE ImageCallback(idsensor est une chaîne="DPMS6C2DB4",largeur
est un entier=0,hauteur est un entier=0, monimg est une chaîne ,resol
est un entier=0)
retourne les caractéristiques de l'image. Elle me retourne bien la
largeur, la hauteur, la résolution de l'image mais pour ce qui est de
l'image brut (monimg) il ne me retourne pas de bonnes valeurs.
Par exemple :
monimg est une chaîne retourne :
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ............;
monimg est un tableau ......, windev refuse de faire passer
un tableau dans une procédure comme variable or cette dernière sera
l'idéale pour récupérer les valeurs de pixels de l'image.;
monimg est un entier, retourne par exemple 52631548;
monimg est un buffer, erreur windev (la variable de type
buffer ne peut être converti en entier);
Avez-vous une idée?
Tu dois récupérer un tableau d'entiers sur 1 octet sans signe.
Ce tableau a pour dimensions width * height.
Cf.
http://www.griaulebiometrics.com/page/en-us/manual/fingerprint-sdk/programming-reference-guide/fingerprint-sdk-dll-reference-guide/grcap_image_event_proc
http://www.griaulebiometrics.com/page/en-us/manual/fingerprint-sdk/using-the-sdk/fingerprint-image-format
(voir également la limitation concernant la version gratuite : l'image
est cryptée)
Pour le format d'image, je suis bien au courant mais mon problème
comme je l'ai dit dans le dernier post,
PROCEDURE ImageCallback(idsensor est une chaîne="DPMS6C2DB4",largeur
est un entier=0,hauteur est un entier=0, monimg est une
chaîne=0 ,resol est un entier=0)
la variable monimg doit être un tableau de 355 par 390 entiers sans
signe sur 1 octet mais je n'arrive pas à la déclarer dans la
procédure.
PROCEDURE ImageCallback(idsensor est une chaîne="DPMS6C2DB4",largeur
est un entier=0,hauteur est un entier=0, monimg est un tableau de 355
par 390 entiers sans signe sur 1 octet ,resol est un entier=0)
windev refuse d'accepter la déclaration de la variable, il met,
"tableau est un mot clé wlanguage"
J'ai essayé de la déclarer avant :
monimg est un tableau de 355 par 390 entiers sans signe sur 1 octet
PROCEDURE ImageCallback(idsensor est une chaîne="DPMS6C2DB4",largeur
est un entier=0,hauteur est un entier=0, monimg ,resol est un
entier=0)
il ne reconnait plus la procédure. il souligne PROCEDURE en rouge.
j'ai déclaré la variable comme une variable globale que j'ai fait
passer dans la procédure.
Refus toujours avec l'erreur suivante (la variable monimg tente de
masquer la variable globale monimg).
Comment puis-je passer un tableau en variable dans une procédure ou il
y a-t-il un autre moyen de récupérer l'image, un autre type de
variable par exemple?
Merci
Non, ce n'est pas un tableau à 2 dimensions, c'est un tableau de
355*390 =138450 entiers sans signe sur 1 octet.
Essaye avec la chaine et utilise Transfert :
PROCEDURE ImageCallback(idsensor est une chaîne="DPMS6C2DB4",largeur
est un entier=0,hauteur est un entier=0, monimg est une chaine, resol
est un entier=0)
eTaille est un entier = largeur * hauteur
MonTableau est un tableau de eTaille entier sans signe sur 1 octet
Transfert(&MonTableau, &MaChaine, eTaille)
J'utilise la fonction dremplissage pour remplir mon champ image mais
j'ai l'impression qu'il cherche à colorer tous le champ image à chaque
pixel or ce que je veux c'est affecter à chaque point du champ une
valeur précise.
Avez-vous une idée?
Merci
> J'utilise la fonction dremplissage pour remplir mon champ image mais
> j'ai l'impression qu'il cherche à colorer tous le champ image à chaque
> pixel or ce que je veux c'est affecter à chaque point du champ une
> valeur précise.
>
> Avez-vous une idée?
dPoint.
Sinon tu peux aussi directement enregistrer l'image au format BMP
(c'est relativement simple) et l'afficher ensuite dans ton champ.
http://www.commentcamarche.net/video/format-bmp.php3
http://www.fileformat.info/format/bmp/egff.htm
Encore plus simple : la fonction existe dans le SDK :
http://www.griaulebiometrics.com/page/en-us/manual/fingerprint-sdk/programming-reference-guide/fingerprint-sdk-dll-reference-guide/grcapsaverawimagetofile
moi je n'ai pas utilisé une classe, ne maitrisant pas trop la POO.
J'ai déclaré montemplate comme un tableau de 10000 entiers sans signe
sur 1 octet, comme une chaîne, comme un buffer. il me met une erreur :
type incompatible pour le paramètre 7.
mavar=AppelDLL32("GrFinger","_GrExtract@28",monim:sources,monim:largeur,monim:hauteur,monim:resolution,montemplate2,GR_MAX_SIZE_TEMPLATE,GR_DEFAULT_CONTEXT)
le paramètre 7 est "montemplate2"
j'ai essayé de passer par le transfert, ça marche mais la fonction au
lieu de me retourner la qualité du template, j'ai plutôt un code
d'erreur (-113 = erreur de type général), peu être que je l'ai mal
utilisé, voila ma syntaxe
montemplate2 est une chaîne
mavar=AppelDLL32("GrFinger","_GrExtract@28",monim:sources,monim:largeur,monim:hauteur,monim:resolution,montemplate2,GR_MAX_SIZE_TEMPLATE,GR_DEFAULT_CONTEXT)
Transfert(&montemplate, &montemplate2, GR_MAX_SIZE_TEMPLATE)
Merci
> le type de la variable template.tpt me joue un peu des tours.
> template est une classe avec tpt un tableau d'entier sans signe et
> size la taille de la mémoire allouée.
>
> moi je n'ai pas utilisé une classe, ne maitrisant pas trop la POO.
non non non, rien à voir avec la POO...
Il s'agit d'un pointeur.
Il faut bien passer un tableau de 10000 (GR_MAX_SIZE_TEMPLATE) entiers
sans signe sur 1 octet mais le paramètre à passer n'est pas le tableau
mais l'*adresse* du tableau.
eRetDLL est un entier
montemplate est un tableau de GR_MAX_SIZE_TEMPLATE entier sans signe
sur 1 octet // 10000
eRetDLL = AppelDLL32("GrFinger","_GrExtract@28", monim:sources,
monim:largeur, monim:hauteur, monim:resolution, &montemplate,
dimension(montemplate),GR_DEFAULT_CONTEXT)
SI eRetDLL<0 ALORS
Erreur("Erreur N°" + eRetDLL)
SINON
Info("Ok")
FIN
Bon, je me suis dis, je prend les templates venus de la base de
données et je m'en sert pour implémenter les autres fonctions
(vérification, identification......)
Je me suis attaqué à la vérification et j'ai créé une procédure que
j'appelle verifie().
voici son code
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PROCEDURE verifie()
montempl, montemplref sont des tableaux de 1 chaînes ASCIIZ sur 10000
TableauAjoute(montempl , montab[3])
i est un entier
score est un entier=0
mavar est un entier
letempl est une chaîne ASCIIZ sur 10000
letempl=montab[3]
mavar=AppelDLL32("GrFinger","_GrIdentifyPrepare@8",&letempl,GR_DEFAULT_CONTEXT)
Info("la préparation a donné : "+mavar)
POUR i=2 A 5
TableauAjoute(montemplref,mesreftempl:template[i])
mavar=AppelDLL32("Grfinger","_GrIdentify@12",montemplref[2],score,GR_DEFAULT_CONTEXT)
SI mavar=GR_MATCH ALORS
Info("vous avez été identifié avec le numéro : "+i)
RETOUR
SINON
Info("erreur de vérification")
FIN
FIN
Info("c'est la fin")
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Déjà au niveau de _GrIdentifyPrepare@8, il me retourne comme valeur -5
== ( A null parameter was supplied ), ce qui m'étonne quand je fais le
débogage, letempl contient bien le template N°3 de la base et
GR_DEFAULT_CONTEXT=0 comme d'habitude. j'ai changé le context,
toujours la même chose.
Je suis passé par un transfert en récupérant le template dans une
chaîne et en le passant dans un tableau dynamique, toujours rien.
Avez-vous une idée?
je lisais avec attention ce thread.
Simplement pour info, il faut savoir que l'utilisation d'une empreinte
digital est très réglementée en France.
Il apparaît également que l'empreinte digitale est peu fiable, et qu'il
est préférable d'utiliser l'empreinte palmaire.
De plus le stockage de l'empreinte est interdit sauf dérogation.
--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Salut,
> je lisais avec attention ce thread.
> Simplement pour info, il faut savoir que l'utilisation d'une empreinte
> digital est très réglementée en France.
> Il apparaît également que l'empreinte digitale est peu fiable, et qu'il est
> préférable d'utiliser l'empreinte palmaire.
> De plus le stockage de l'empreinte est interdit sauf dérogation.
Faut voir ce que dit la loi de la République du Bénin...
A+
Mais comme c'est un projet universitaire, je crois que les
dispositions doivent être prise.
Je termine une formation d'ingénieur en traitement de signal et c'est
mon projet de fin d'étude. Si vous avez une idée sur l'erreur que mon
programme retourne, cela m'aiderait à avancer et à mieux comprendre le
fonctionnement de windev.
J'ai quand même entré tous les paramètres mais il me dit: A NULL
parameter was supplied.
A NULL selon moi signifie que le paramètre est là mais avec une valeur
nulle alors que quand je fais le débogage, les deux paramètres envoyés
contiennent tous leur valeur.
HELP
Bonjour j'ai le même problème, lorsque j'installe le sdk, le lecteur
d'empreinte ne s'allume plus. Est ce que quelqu'un pourrait
m'expliquer que faire pour que celui ci fonctionne de nouveau.
Merci par avance
A+
J'utilise FingerPrint SDK 2007 avec le FingerPrintReader de Microsoft
Et les applications qui sont sur le SDK ne fonctionnent pas
correctement
A vrai dire des que j'installe FingerCap USB Driver suite à
l'installation du SDK le lecteur s'eteind.
Et lorsque j'essaye de le faire fonctionner sans celui ci le programme
que je suis en train d'effectuer ne prend pas en compte le lecteur.
A+
**GrFingerX Initialized Successfull**
Sensor: File. Event: Plugged.
la suite doit être
Sensor: DPMS6C2DB4. Event: Plugged.
avec DPMS6C2DB4, l'identifiant du lecteur dans mon cas.
Il va falloir changer ton appareil, j'espère que tu es dans la période
de garantie ou vérifie que ton poste respecte la configuration
minimale exigée dans la doc de l'SDK. Et essai avec une application
DLL et non ActiveX pour voir (Fingerprint SDK Delphi 6-7 et non
Fingerprint SDK ActiveX Delphi 6-7).
J'ai moi aussi l'intention de mettre en oeuvre cette reconaissance biometrique;
toutefois je ne me sens pas capable de developper l'ensemble des processus
(fenêtres et procedures) .
Pourriez-vous me fournir les éléments nécessaires (fenêtres, codes sources,
dll, etc ) pour intégrer cette fonctionalité dans un projet existant ?
Si oui, alors je vous serai très reconaissant.
Patrick
Merci d'avance...