| Comment programmer une dll ? | |
|
|
|
Auteur | Message |
---|
mimic
Nombre de messages : 103 Localisation : france Date d'inscription : 02/09/2009
| Sujet: Comment programmer une dll ? Sam 3 Jan 2015 - 12:34 | |
| Bonjour,
Comment procéder pour programmer une dll sous paranomic ?
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Sam 3 Jan 2015 - 12:43 | |
| On ne peut pas. Ce n'est pas prévu.
Pour faire une DLL, il faut utiliser d'autres langages qui offrent cette possibilité. Ils sont nombreux: Delphi, Visual Basic, FreeBasic, ... Il y en a des dizaines.
Maintenant, si tu veux faire une DLL à utiliser à partir de Panoramic, il faut respecter certaines règles très strictes et contraignantes. Il y a sur le forum et dans la "Mag", plusieurs articles et tutos à ce sujet. | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 8:55 | |
| | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 10:57 | |
| Bonjour. Je teste la création puis l'utilisation d'une DLL. La DLL en FreeBasic est la suivante: - Code:
-
' extern "WindowsMS"
function IntFunc(n as integer) as integer export ' fonction à paramètre entier return 2 * n end function
function RealFunc(byref x as double) as integer export ' fonction à paramètre réel (double précision) return int(x) end function
function StrFunc(byref p as zstring ptr) as integer export ' fonction à paramètre chaîne de caractère return len(*p) end function
' end extern J'ai supprimé les appels à extern, car Panoramic ne les reconnaît pas. Voici le code d'utilisation de la DLL: - Code:
-
dim i%, a, s$, result% i% = 10 a = 3.14159 s$ = "Bonjour"
dll_on "ma_dll.dll"
result% = dll_call1("IntFunc", i%) : print result% result% = dll_call1("RealFunc", adr(a)) : print result% result% = dll_call1("StrFunc", adr(s$)) : print result%
dll_off Ce code est extrait de l'article de Jean Debord. A l'exécution, j'obtiens le message d'erreur suivant: Not Correct Arithmetic Expression ligne 6. L'appel à la DLL provoque une erreur. Merci de votre aide pour la résolution du problème. | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 11:04 | |
| Bonjour.
Je viens de trouver la source de l'erreur.
Il faut écrire, dans la DLL: extern "Windows-MS" et non extern "WindowsMS".
Tout fonctionne parfaitement maintenant.
Je peux maintenant écrire des DLL en FreeBasic.
SUPER ! | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 11:22 | |
| Juste une petite info, Pedro: sois prudent avec le passage de chaînes de caractères en paramètre. En Panoramic, tu utilises adr(s$), ce qui est correct. Dans la DLL, tu utilises cette chaîne en lecture - bien. Mais attention en modifiant cette chaîne via le paramètre passé par référence ! La nouvelle valeur copiée dans ce paramètre doit avoir au maximum la longueur de la chaîne initiale. Un dépassement va très certainement provoquer une violation de mémoire, et une chaîne trop courte, si elle se termine par un octet 0 (zéro), va perturber la gestion des chaînes de Panoramic. | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 11:25 | |
| OK. Merci de l'info Klaus.
Maintenant, j'aimerais traiter des nombres à virgule flottante par la DLL.
C'est-à-dire utiliser une fonction sur un nombre double, et retourner un résultat double.
Comment puis-je faire ?
Merci de ton aide. | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 11:54 | |
| Tu ne peux pas le faire simplement. Solution: envoyer une chaine formatée avec un certains nombre de caractères et le séparateur. Autre solution: Envoyer 2 entier: Un avec les chiffres et un représentant la position de la virgule dans la suite de chiffres de cet entier... | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 12:17 | |
| Je pense que tu peux le faire.
Il faut passer le flottant par référence, en utilisant adr(f) dans le programme Panoramic. Dans la DLL, tu récupères la valeur en déréférençant le pointeur passé. Tu fais ton traitement dans la DLL. Puis, tu retournes le résultat via le pointeur, par référence. Le résultat de type integer de ta fonction sera ce que tu voudras - toujours 0, un code erreur, ...
J'ai essayé - ça marche. | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 13:26 | |
| Bonjour.
@Klaus.
Je n'ai pas tout compris.
Pourrais-tu poster un exemple d'utilisation ici ?
Merci. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 14:00 | |
| En Panoramic, tu écris: - Code:
-
dim res%, f1, f2, f3 f1 = 17.23 f2 = 58.89 res% = dll_call3("AddFloat",adr(f1),adr(f2),adr(f3)) message str$(f3) En dans la DLL, tu codes ainsi: - Code:
-
function AddFloat(byref x as double,byref y as double,byref z as double) as integer export ' fonction à paramètre réel (double précision) f3 = f1 + f2 return int(0) end function Tu vois le principe ? | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 14:05 | |
| A oui, c'est pas bête ça ... désolé, je n'y avais pas pensé. | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 14:28 | |
| Bonjour. Voici un code qui marche, pour les double: - Code:
-
extern "Windows-MS"
' dim shared f1 as double ' dim shared f2 as double ' dim shared f3 as double
function IntFunc(n as integer) as integer export ' fonction à paramètre entier return 2 * n end function
function RealFunc(byref x as double) as integer export ' fonction à paramètre réel (double précision) return int(x) end function
function StrFunc(byref p as zstring ptr) as double export ' fonction à paramètre chaîne de caractère return int(*p) end function
function Racine(byval x as double) as double export ' fonction à paramètre réel (double précision) return Sqr(x) end function
function AddFloat(byref x as double,byref y as double,byref z as double) as double export ' fonction à paramètre réel (double précision) z=sqr(x)*y return z end function
end extern et le code Panoramic: - Code:
-
dim res%, f1, f2, f3
dll_on "ma_dll.dll" f1 = 2.0 f2 = 2.0 res% = dll_call3("AddFloat",adr(f1),adr(f2),adr(f3)) message str$(f3) dll_off | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 15:55 | |
| Bonjour. Voici un petit code utilisant une dll FreeBasic qui fonctionne avec les chaînes de caractères. Il fournit la position d'une sous-chaîne dans une chaîne, mais en commençant la recherche à partir de la fin de la chaîne. - Code:
-
dim a$, b$, res%, f1, f2, f3
dll_on "ma_dll.dll" f1 = 2.0 f2 = 2.0 res% = dll_call3("AddFloat",adr(f1),adr(f2),adr(f3)) ' message str$(f3)
a$="bonjour" b$="b" res%=dll_call2("LastInstr",adr(a$),adr(b$)) message str$(res%)
dll_off Code de la dll. - Code:
-
extern "Windows-MS"
' dim shared f1 as double ' dim shared f2 as double ' dim shared f3 as double dim shared b as string dim shared k as integer
function IntFunc(n as integer) as integer export ' fonction à paramètre entier return 2 * n end function
function RealFunc(byref x as double) as integer export ' fonction à paramètre réel (double précision) return int(x) end function
function StrFunc(byref p as zstring ptr) as double export ' fonction à paramètre chaîne de caractère return int(*p) end function
function Racine(byval x as double) as double export ' fonction à paramètre réel (double précision) return Sqr(x) end function
function AddFloat(byref x as double,byref y as double,byref z as double) as double export ' fonction à paramètre réel (double précision) z=sqr(x)*y return z end function
function LastInstr(byref p as zstring ptr, byref q as zstring ptr) as integer export b="" for k=len(*p) to 1 step -1 b=b+mid(*p,k,1) next k return InStr(b, *q) end function
end extern | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 16:07 | |
| Interessant tout ça. On pourrait mettre un article dans le mag avec comment créeer la dll en vb, delphi, free basic ou peut être en c aussi ? Après, ce sera un collection de DLL par thème qu'il faudra avoir. Le truc c'est de pouvoir travailler avec plusieurs DLL de manière inuitive, on peut le faire par l'appel d'une fonction dans certains cas qui ouvre la DLL, appelle la founction et referme la DLL. Tout dépend de l'usage et des temps de réponses attendu. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 17:53 | |
| @Pedro: concernant: - Code:
-
function AddFloat(byref x as double,byref y as double,byref z as double) as double export ' fonction à paramètre réel (double précision) z=sqr(x)*y return z end function
As-tu vérifié la valeur retournée comme résultat ? Le résultat doit obligatoirement être un integer, pas un flottant. Donc, ta fonction devrait plutôt être ainsi: - Code:
-
function AddFloat(byref x as double,byref y as double,byref z as double) as integer export ' fonction à paramètre réel (double précision) z=sqr(x)*y return 0 end function
| |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 20:21 | |
| Bonsoir. @Klaus. Eh bien non, la fonction de la DLL marche très bien, en retournant un flottant, à ma grande surprise. Code Panoramic. - Code:
-
dim a$, b$, c$, epc$, res%, f1, f2, f3
dll_on "ma_dll.dll" f1 = 2.0 f2 = 2.0 res% = dll_call3("AddFloat",adr(f1),adr(f2),adr(f3)) message str$(f3)
a$="bonjour" b$="b" res%=dll_call2("LastInstr",adr(a$),adr(b$)) ' message str$(res%)
a$= "bonjour ()" epc$=" " res% = dll_call2("enlever_parentheses_et_crochets",adr(a$),adr(epc$)) ' message epc$
dll_off Code de la DLL. - Code:
-
extern "Windows-MS"
' dim shared f1 as double ' dim shared f2 as double ' dim shared f3 as double dim shared b as string dim shared epc as string dim shared temporaire as string dim shared k as integer dim shared y as integer dim shared true as integer
function AddFloat(byref x as double,byref y as double,byref z as double) as double export ' fonction à paramètre réel (double précision) z=sqr(x)*y return z end function
end extern | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Lun 5 Jan 2015 - 20:47 | |
| Bonsoir. Et maintenant, cela fonctionne également avec les chaînes de caractères. Code Panoramic. - Code:
-
dim a$, b$, res%
dll_on "ma_dll.dll"
a$="bonne" b$=string$(255," ") res%=dll_call2("test",adr(a$),adr(b$)) message trim$(b$)
dll_off Code de la DLL. extern "Windows-MS" ' dim shared f1 as double ' dim shared f2 as double ' dim shared f3 as double dim shared b as string dim shared epc as string dim shared temporaire as string dim shared k as integer dim shared y as integer dim shared true as integer function test(byref p as zstring ptr, byref b as zstring ptr) as string export *b=*p+" année" return *b end function end extern | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Lun 5 Jan 2015 - 23:03 | |
| Pas d'accord, Pedro. Désolé. Affiche la valeur de res% en sortie... | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 6 Jan 2015 - 0:38 | |
| Je ne suis pas un fabricant de dll, la seule que j' ai pondu... ...je ne me souviens même plus comment j' ai fait . C' était avec Freebasic mais je ne sais plus les manips pour compiler en .dll. Si il y a un amateur de tuto pour cela, je le publierai avec plaisir sur le mag.Mais devant votre volonté de passer des strings, $ pas les ficelles , à une dll et les récupérés dans Panoramic. Je demande si il n' est pas possible de jouer avec les codes ASCII des caractères ?... Le traitement de caractères typo à nombre et de nombre à caractères typo risque par contre de prendre du temps. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Comment programmer une dll ? Mar 6 Jan 2015 - 0:55 | |
| @Ygeronimi: En FreeBasic, ce sera plus simple que ça. On peut traiter ces chaînes normalement, comme toutes les chaînes, dans le code FreeBasic de la DLL. Et, comme pour les paramètres de type chaîne en entrée, il faut passer un paramètre de type chaîne pour la sortie, et tout cela "by ref" en FreeBasic, et avec adr() dans Panoramic.
Il faut bien sûr faire attention à ce que le résultat retourné ne dépasse pas la longueur de la chaîne existante déjà dans le paramètre de sortie - sinon, violation de mémoire.
Mais, et cela s'adresse surtout à Pédro: il faut bien avoir conscience que Panoramic exige que la fonction DLL retourne une valeur numérique de type entier. Pas un flottant, pas une chaîne de caractères. Il faut donc impérativement définir toutes ces fonctions "as integer export" et affecter impérativement une valeur de type integer dans la commande "return". C'est une des contraintes majeures à respecter en concevant des DLLs pour Panoramic. | |
|
| |
Pedro
Nombre de messages : 1594 Date d'inscription : 19/01/2014
| Sujet: Comment programmer une DLL Mar 6 Jan 2015 - 7:19 | |
| Bonjour. @Klaus. Désolé, mais chez moi, j'obtiens bien une chaîne correcte en sortie. Je passe bien un entier res% pour exécuter la DLL, mais ensuite je réussis à récupérer la valeur de la chaîne traitée b$. - Code:
-
dim a$, b$, res%
dll_on "ma_dll.dll"
a$="bonne" b$=string$(255," ") res%=dll_call2("test",adr(a$),adr(b$)) message trim$(b$)
dll_off J'utlise FreeBasic Ide version 0.4.6, avec la dernière version de Panoramic. Code de la DLL. - Code:
-
extern "Windows-MS"
dim shared b as string
function test(byref p as zstring ptr, byref b as zstring ptr) as string export *b=*p+" année" return *b end function
end extern | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Comment programmer une dll ? Mar 6 Jan 2015 - 9:09 | |
| @Pedro Alvarez :
ça marche parce que tu affiches b$, mais essaye d'afficher res% : tu obtiens bien un nombre entier (probablement l'adresse de b$)
Il vaut mieux suivre le conseil de Klaus et utiliser res% pour retourner soit le résultat de la fonction s'il est entier, soit un code d'erreur.
PS. On n'a pas besoin du "dim shared b ..." dans la DLL. C'est une variable globale, distincte de la variable passée en paramètre. | |
|
| |
mimic
Nombre de messages : 103 Localisation : france Date d'inscription : 02/09/2009
| Sujet: Re: Comment programmer une dll ? Mar 6 Jan 2015 - 11:32 | |
| Je vois que j’ai bien fait d’ouvrir ce sujet…
Bon, je vais commencer par télécharger le tuto proposé par Fhoest (Merci).
| |
|
| |
mimic
Nombre de messages : 103 Localisation : france Date d'inscription : 02/09/2009
| Sujet: Re: Comment programmer une dll ? Mar 6 Jan 2015 - 14:05 | |
| Le tutoriel est une vidéo ? Où une version papier téléchargeable ? merci, de m’indiquer le lien, car je me perds un peu sur le forum de Fhoest. | |
|
| |
Contenu sponsorisé
| Sujet: Re: Comment programmer une dll ? | |
| |
|
| |
| Comment programmer une dll ? | |
|