FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Button_picture
par pascal10000 Aujourd'hui à 11:41

» Pourquoi le compilateur stagne
par Minibug Aujourd'hui à 11:09

» 4 (en analyse): SYNEDIT_TARGET_IS_OBJECT devient inactif
par Jack Aujourd'hui à 10:09

» 3 (en analyse): Mauvaise interprétation du string "THEN"
par Jack Aujourd'hui à 10:03

» KGF.dll - demandes ou suggestions de modifications ou ajouts
par Marc Aujourd'hui à 10:00

» KGF_dll - nouvelles versions
par pascal10000 Hier à 17:27

» Mah-Jong européen new-look
par Minibug Mar 12 Déc 2017 - 22:31

» track_bar circulaire
par Klaus Mar 12 Déc 2017 - 13:54

» API Windows
par Klaus Mar 12 Déc 2017 - 3:21

» Cartes de voeux, menus, etc.
par JL35 Lun 11 Déc 2017 - 17:48

» a l'aide klaus
par Minibug Lun 11 Déc 2017 - 11:42

» bug SYNEDIT_TARGET_IS_OBJECT
par Jack Lun 11 Déc 2017 - 0:16

» Jukebox : Serge Reggiani
par papydall Sam 9 Déc 2017 - 5:58

» Ecouter la radio fm sur votre pc
par pascal10000 Sam 9 Déc 2017 - 3:42

» anomalie
par Klaus Sam 9 Déc 2017 - 3:21

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Décembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier

Partagez | 
 

 Comment programmer une dll ?

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
mimic

avatar

Nombre de messages : 75
Localisation : france
Date d'inscription : 02/09/2009

MessageSujet: Comment programmer une dll ?   Sam 3 Jan 2015 - 14:34

Bonjour,

Comment procéder pour programmer une dll sous paranomic ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Sam 3 Jan 2015 - 14: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 10:55

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 12: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 13: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 13: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 13: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 13: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 14: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 15:26

Bonjour.

@Klaus.

Je n'ai pas tout compris.

Pourrais-tu poster un exemple d'utilisation ici ?

Merci.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 16: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 ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 16:05

A oui, c'est pas bête ça ... désolé, je n'y avais pas pensé.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 16: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 17: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5863
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 18: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Lun 5 Jan 2015 - 19: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 22: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Lun 5 Jan 2015 - 22: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Mar 6 Jan 2015 - 1:03

Pas d'accord, Pedro. Désolé. Affiche la valeur de res% en sortie...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 8002
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mar 6 Jan 2015 - 2: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 Embarassed .
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 Laughing
à une dll et les récupérés dans Panoramic.
Je demande scratch 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10259
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Comment programmer une dll ?   Mar 6 Jan 2015 - 2: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 882
Date d'inscription : 19/01/2014

MessageSujet: Comment programmer une DLL   Mar 6 Jan 2015 - 9: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jean_debord

avatar

Nombre de messages : 765
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Comment programmer une dll ?   Mar 6 Jan 2015 - 11: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
mimic

avatar

Nombre de messages : 75
Localisation : france
Date d'inscription : 02/09/2009

MessageSujet: Re: Comment programmer une dll ?   Mar 6 Jan 2015 - 13: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).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
mimic

avatar

Nombre de messages : 75
Localisation : france
Date d'inscription : 02/09/2009

MessageSujet: Re: Comment programmer une dll ?   Mar 6 Jan 2015 - 16: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Comment programmer une dll ?   

Revenir en haut Aller en bas
 
Comment programmer une dll ?
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Comment programmer le module roco 10777
» achat Train programmer ?
» Comment programmez-vous vos décodeurs?
» BK-7M - Comment programmer les "ONE TOUCH" ?
» Navigation avec EDGE 800

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: