Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Comment utiliser DLL_CALL0 ? | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Comment utiliser DLL_CALL0 ? Jeu 4 Mar 2010 - 23:15 | |
| Bonsoir, J'essaie d'utiliser DLL_CALL0 et j'ai besoin de vos lumières. J'ai écrit une petite DLL test1 contenant un seul sousprogramme number17 retournant un entier de valeur 17. Le fichier test1.dll est pl&cé dans le répertoire de l'éditeur Panoramic (à cause du chemin relatif). Voici mon programme Panoramic: - Code:
-
dim n% dll_on "test1.dll" n% = dll_call0("number17") message(str$(n%)) dll_off end Je suis certain que Panoramic appelle bien ma DLL car mon pare-feu m'en demande une autorisation temporaire. Mais Panoramic me rejette avec l'erreur suivante: - Code:
-
(29) Not Correct Arithmetic Expression: Error in function, line: 4
Quel est le format d'une "expression arithmétique" ? Comment ma routine dans la DLL doit-elle formatter le résultat ? D'ailleurs, question corollaire, en utilisant DLL_CALL1("fonction",param), je sais que param doit être également le résultat d'une expression arithmétique. Comment cela se présente-t-il ? De la même manière ? Merci beaucoup de votre aide. J'ai trouvé tout seul comment faire une DLL et l'appeler par PAnoramic, mais là, je sèche. | |
| | | Invité Invité
| Sujet: Re: Comment utiliser DLL_CALL0 ? Ven 5 Mar 2010 - 0:35 | |
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Ven 5 Mar 2010 - 1:03 | |
| Bonsoir, Cosmos70,
Merci pour ton aide. Mais le problème de devient pas plus clair pour autant, car en résultat des DLL_CALL, il y a tantôt un entier, tantôt un réel simple, et dans les paramètres, il en est de même. Les liens vers les exemples sont morts aussi, alors,cela devient difficile.
Demain, je vais essayer avec la DLL des cartes tel que c'est suggéré par Jack; maintenant,je vais me coucher.
A bientôt Klaus | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Ven 5 Mar 2010 - 8:06 | |
| Bon, frais et reposé, j'ai essayé les examples donnés par Jack concernant la DLL des cartes. Surprise: cela produit la même erreur dès le premier appel de DLL_CALL, soit à la ligne 4 chaque fois !
Là, je pense, c'est pour Jack: est-ce que les DLL_CALL auraient souffert en passant à la nouvelle version ? | |
| | | Invité Invité
| Sujet: Re: Comment utiliser DLL_CALL0 ? Ven 5 Mar 2010 - 13:55 | |
| Tu pourrais en attendant essayer avec une ancienne version, pour voir ce que cela donne. |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Comment utiliser DLL_CALL0 ? Ven 5 Mar 2010 - 18:59 | |
| - Citation :
- est-ce que les DLL_CALL auraient souffert en passant à la nouvelle version ?
Non, pas du tout. Voici un fichier ZIP qui contient: - une DLL - un fichier de test de cette DLL C'est ce fichier qui me sert à tester les appels de fonctions d'une DLL avant la mise à disposition d'une version de PANORAMIC. Le test est positif quand on visualise des couples de nombres identiques. http://dl.free.fr/egNPfU4Wb | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Ven 5 Mar 2010 - 23:02 | |
| Merci, Jack, pour la mise à disposition du kite de test.
En effet, tout marche bien. Alors, mon problème n'en est que plus mystérieux, car mon message d'erreur indiqué ci-dessus persiste avec ma DLL.
Elle est écrite en Watcom Fortran (norme Fortran 77) et retourne une valeur numérique égale à 17, pour le test. Elle a un seul point d'entrée appelé number17.
Je sais que je rentre bien dans la DLL, mais c'est la valeur au retour qui est rejeté par Panoramic. Qu'est-ce qu'un attend ? Une valeur binaire entière ou flottante, 16 ou 32 bits, ou une adresse pointant vers... quoi ? La documentation dit simplement "résultat arithmétique".
J'ai peut-être manqué quelque chose d'évident, mais la structure d'un "résultat arithmétique" dépend peut-être du langage dans lequel la DLL a été écrite.
Cordialement Klaus | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Comment utiliser DLL_CALL0 ? Sam 6 Mar 2010 - 9:09 | |
| Je m'aperçois que je n'ai donné aucune explication sur les fonctions de la DLL MyTestDLL.dll. Les voici: --------------------------------------------------- fonction TstCall0 paramètres : aucun retour : 153 --------------------------------------------------- fonction TstCall1 paramètres : Nb1 retour : Nb1 * Nb1 --------------------------------------------------- fonction TstCall2 paramètres : Nb1, Nb2 retour : Nb1 + Nb2 --------------------------------------------------- fonction TstCall3 paramètres : Nb1, Nb2, Nb3 retour : Nb1 + Nb2 + Nb3 --------------------------------------------------- fonction TstCall4 paramètres : Nb1, Nb2, Nb3, Nb4 fetour : Nb1 + Nb2 + Nb3 + Nb4 --------------------------------------------------- fonction TstCall5 paramètres : Nb1, Nb2, Nb3, Nb4, Nb5 retour : Nb1 + Nb2 + Nb3 + Nb4 + Nb5 --------------------------------------------------- fonction TstCall6 paramètres : Nb1, Nb2, Nb3, Nb4, Nb5, Nb6 retour : Nb1 + Nb2 + Nb3 + Nb4 + Nb5 + Nb6 --------------------------------------------------- Toutes ces fonctions retournent une valeur entière. Une DLL peut être écrite dans n'importe quel langage, pourvu qu ce langage respecte certaines convention pour le passage des paramètres. PANORAMIC respecte le standard le plus répandu car utilisé par le C++: il suppose que la fonction appelée est en mode STDCALL. Voici la partie essentielle du code de DLL_CALL0(): - Code:
-
CALL [Adr_Fonct] MOV Res_Int, EAX Adr_Fonct est l'adresse de la fonction appelée dans la DLL par DLL_CALL0(), le registre EAX contient la valeur entière retournée par la fonction appelée. Je remplis la variable Res_Int avec ce registre et c'est cette valeur qui sera utilisée dans l'expression arithmétique comme résultat de l'appel de la fonction DLL_CALL0(). j'appelle "expression arithmétique" une expression telle que: 24+DLL_CALL0("TstCall0")*3-SQR(19) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 0:14 | |
| Bonsoir, Jack,
J'ai pris soin d'assurer le mode STDCALL, et je charge les valeurs en retour de ma fonction dans EAX, comme tu le demandes. J'ai vérifié cela dans un debuggeur hexa, et ma valeur est bien dans EAX, juste avant le return.
Or, Panoramic ne veut toujours pas de ma valeur, avec le message indique dans mon post précédent. Je suis un peu perdu...
Ceci dit, il n'y a pas le feu à la maison, alors, quand tu auras un moment...
Cordialement Klaus
P.S. Est-ce que ta DLL a été faite avec Delphi ? J'ai essayé d'utiliser Delphi et je me suis heurté à un problème de taille. J'ai téléchargé la version gratuite de Delphi, mais à l'installation, il me demande un code licence que je peux obtenir gratuitement via un lien afiiché, mais ce lien est mort ! Donc, impossible d'installer. C'est pour cette raison que jeme suis rabattu sur Fortran... | |
| | | Invité Invité
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 0:26 | |
| Salut Klaus. J'ai installé Delphi gratuitement et je travaille dessus. Pour l'installation, il demande bien de s'enregistrer, mais effectivement le lien est mort. Tu as la possibilité d'ignorer cet enregistrement, et il installe quant même. Revérifie. Par contre tu ne peux pas utiliser deux version de Delphi. Si tu changes de version, il faut désinstaller l'autre. A+ Je rajoute que la version Delphi7 (excusez moi, on est ici en Panoremic, mais c'est pour la bonne cause) si tu as Avast, il trouve régulièrement un Trojan sur tes programmes. J'ai fini par désinstaller Avast pour mettre Aviva Antivir. Au moins on peut travailler. Avec Delphi 6 il n'y a pas ce problème. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 0:42 | |
| Merci, cosmos70, pour ces infos sur Delpi. J'essayerai dès demain.
Juste pour info:
Concernant l'antivir, j'ai Antivir de Avira depuis longtemps, associé à SpywareTerminator avec CLAM Antivirus intrégré - je n'ai plus été infecté depuis longtemps, et SpywareTerminator ayant un mode "apprentisage", il finit par connaître les programmes et ne bloque que les intrusions venant par internet.
Allez, ça suffit pour aujourd'hui. Bonne nuit Klaus
EDIT ===
J'ai essayé ce matin: à l'installation, il demande le numéro de série et la clé d'autorisation. On ne peut pas passer outre - on a toujours le message "L" numéro de série ou la clé d'autorisation est incorrect". Pas moyen de continuer. Il s'agit de Delphi 6 par le fichier Delphi6PersoFR.exe. | |
| | | Invité Invité
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 9:03 | |
| Je me souviens, c'est info sont sur la page de téléchargement. Regarde bien, c'est pas très gros. Salutation. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 10:32 | |
| OK, j'ai réussi ! Merci !
Je vais commencer à explorer le produit.
Ceci dit, cela n'enlève rien au fait que je n'arrive pas à comprendre pourquoi les valeurs arithmétiques retournées pas ma DLL Fortran ne sont pas acceptées pas Panoramic !
Cordialement Klaus | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 16:35 | |
| La DLL MyTestDLL.dll est écrite en Delphi 6. Si cela peut t'aider, voici le source: - Code:
-
library MyTestDLL; uses SysUtils, Classes;
var // variables locales (ne sont pas utilisées) I1: integer; I2: integer;
// ----------------------------------------------------------------------------- function TstCall0 : integer; stdcall; begin Result := 153; end; // ----------------------------------------------------------------------------- function TstCall1(Nb1 : integer) : integer; stdcall; // on élève au carré begin Result := Nb1 * Nb1; end; // ----------------------------------------------------------------------------- function TstCall2(Nb1, Nb2 : integer) : integer; stdcall; // on additionne begin Result := Nb1 + Nb2; end; // ----------------------------------------------------------------------------- function TstCall3(Nb1, Nb2, Nb3 : integer) : integer; stdcall; // on additionne begin Result := Nb1 + Nb2 + Nb3; end; // ----------------------------------------------------------------------------- function TstCall4(Nb1, Nb2, Nb3, Nb4 : integer) : integer; stdcall; // on additionne begin Result := Nb1 + Nb2 + Nb3 + Nb4; end; // ----------------------------------------------------------------------------- function TstCall5(Nb1, Nb2, Nb3, Nb4, Nb5 : integer) : integer; stdcall; // on additionne begin Result := Nb1 + Nb2 + Nb3 + Nb4 + Nb5; end; // ----------------------------------------------------------------------------- function TstCall6(Nb1, Nb2, Nb3, Nb4, Nb5, Nb6 : integer) : integer; stdcall; // on additionne begin Result := Nb1 + Nb2 + Nb3 + Nb4 + Nb5 + Nb6; end; // ----------------------------------------------------------------------------- exports TstCall0, TstCall1, TstCall2, TstCall3, TstCall4, TstCall5, TstCall6;
begin // juste pour montrer qu'on peut utiliser des variables locales I1 := 0; I2 := 0; end. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment utiliser DLL_CALL0 ? Dim 7 Mar 2010 - 17:22 | |
| Salut, Jack, JE VIENS DE TROUVER ! Voici le code me ma première DLL: - Code:
-
library SimpleMessageDLL;
uses SysUtils, Classes, Dialogs;
function DllMessage:integer ; export;
begin
ShowMessage('Hello world from a Delphi DLL') ;
Result := 17;
end;
exports DllMessage;
begin
end.
Et puis, en revenant sur le site pour poster mon HEUREKA, j'ai trouvé ton post qui confirme ma supposition: la DLL est écrite en Delphi. J'ai installé un Delphi 6 Personnal Franançais et j'ai fait une première DLL qui peut parfaitement retourner des valeurs. J'ai trouvé le code de base sur un forum et je l'ai adapté pour retourner ma valeur 17. Mais dans la DLL, on définit chaque fonction avec le type de valeur qu'elle doit retourner (chez toi: ":integer"). Ca marche aussi avec d'autres types de données, à condition de ne pas utiliser des strings longs. Je pense donc que la DLL retourne en fait un pointeur vers un déscripteur, de type ptr-->[adresse/longueur] ou ptr-->[type/adresse/longueur] ou simpilaire. Ceci expliquerait que ma valeur chargée dans EAX ne soit pas acceptée. Probablement, EAX contient en fait un pointeur vers un déscripteur ou vers la donnée en mémoire temporaire. Quoi qu'il en soit, puisque ça marche avec Delphi, j'en resterai avec Delphi et ferai mes DLL avec ça. Merci beaucoup de ton aide, et pardon pour le dérangement occasionné. | |
| | | Contenu sponsorisé
| Sujet: Re: Comment utiliser DLL_CALL0 ? | |
| |
| | | | Comment utiliser DLL_CALL0 ? | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |