-
Hresult & Delphi
bonjour à tous,
j'utilise des fonctions situées dans une librairie externe, et je dois gérer les codes retournés par ces fonctions. Il est dit que ces fonctions retournent un HRESULT... j'ai vu que ce type était longint, mais comment ça s'utilise ?
Si je fais :
var
err : hresult;
begin
err := mafonction();
à la compil j'ai : [Erreur] Types incompatibles : 'HRESULT' et 'procedure, untyped pointer or untyped parameter'
comment faut-il faire ?
Merci de vos explications ...
-
Qu'est ce que "MaFonction" ?!? une methode a toi ?
[Edit] En plus tu as pas mis de parametres a ta fonction ....
En pascal, une fonction/Procedure vide n'a pas de parenthese.
-
mafonction est la fonction externe que j'appelle. En fait je dois passer un entier, donc ce serait mafonction(0) par exemple.
Ce sont des fonctions qui se trouvent dans un activex (J'ai importé la bibliothèque de types) et ça marche très bien, sauf que je ne sais pas récupérer les codes d'erreurs éventuels.
euh suis-je plus clair ?
-
Tout a fait.
PAr contre, MaFonction est une fonction visiblement ici.
Or a mon avis ca doit etre une methode de classe ... sinon je ne voit pas d'erreur particuliere.
-
Mais oui tu as raison !!! ma description est fausse
En fait j'appelle une fonction d'un objet COM
err := ObjetCom.Fonction(0);
et c'est ça qui déclenche l'erreur à la compil :
Types incompatibles : 'HRESULT' et 'procedure, untyped pointer or untyped parameter'
Bon, là c'est plus clair ! Alors qu'estce qui ne va pas, ou plutot qu'est ce que je n'ai pas compris ?
-
Envoie la definision complete de la fonction et le code exact d'appel :)
-
Dans la doc de l'objet COM : Procedure décrite pour VC++ (que je ne connais pas)
HRESULT Sign(short nFlag);
Signe le fichier contenu dans l'objet XDocument
• nFlag indique si on attache un jeton d’horodatage et/ou u
signature.
dans le wrapper de composant généré par delphi la procedure est :
procedure Sign(nFlag: Smallint);
dans mon programme, j'ai donc une form sur laquelle j'ai mis le composant mis à dispo par le wrapper.
J'appelle alors la procédure par
xdocument1.Sign(0);
et ça fonctionne bien, (le document chargé dans le composant est signé, puisque c'est le boulot de la procédure en question) sauf que s'il ya un problème, je ne sais pas le code d'erreur retourné par la procédure... voilà voilà
-
Ben .... vu comme ca ... ya pas de code d'erreur retourné :)
Vu que Procedure ne renvoit rien ..... Fucntion oui mais pas Procedure ;)
Donc 2 solution : Soit, ta doc date un peu ... soit Delphi a foiré son wrapper.
Ce qui arrive (il parrait) assez souvent.
Je regarderais plutot du cote de l'interface associé a ce composant.
en general, c'est le meme nom mais avec un "I" au lieu du "T"
Si la fonction est bien une Fucntion alors c'est que Delphi a foirer son import.
Je te conseille de ne pas generer le wrapper de composant (decocher la case en bas lors de l'import) et de traiter directement via l'interface adequate que l'on charge avec "coXXXX.Create" ou XXXX est le nom de ta classe.
-
Effectivement je comprends que je n'ai pas de retour....
Bon ça me dépasse un peu, je vais laisser mûrir quelques heures.
Merci de ton aide en tout cas.
-
Il semble bien que le probleme ne vient pas du wrapper, mais plutot de l'interface... j'ai bien un procedure et non pas une fonction dans l'interface...
-
Dans ce cas, essaye de faire marcher ton application via la procedure (donc sans retour d'erreur) et de voir si tout marche bien.
si oui, ya des chances pour que ce soit ta doc qui date un peu ;)
Bon tu peux toujours essayer de remplacer la procedure par une fonction et voir si ca reagit bien, ce qui sous entendrais une erreur de recuperation mais j'en doute.
Sinon il se peux que ta doc soit acces C/C++ donc sous forme de librairie plus ou moins statique, avec manipulation des classes directement.
Or sous Delphi il te faut une version COM de la Dll pour dialiguer avec elle, ce qui suppose le developpement de classes specifique dont une application C/C++ peut se passer.
Dans ce cas, le systeme de gestion est peut etre autre ....
Il est possible que le wrapper ait generé des evenements executés en cas d'erreur (ie OnError par exemple).
Ou qu'une methode du type GetErrorValue soit propose pour recuperer les erreurs suite a un appel ....
Tout peut etre envisageable :)