DLL POUR EXECUTER LES FONCTIONS ET PROCEDURES EXTERNES A TON APPLI MEME DEJA COM

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 16 juin 2008 à 10:55
jimbilba Messages postés 10 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 12 juillet 2013 - 30 avril 2010 à 13:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47010-dll-pour-executer-les-fonctions-et-procedures-externes-a-ton-appli-meme-deja-compile

jimbilba Messages postés 10 Date d'inscription lundi 25 janvier 2010 Statut Membre Dernière intervention 12 juillet 2013
30 avril 2010 à 13:32
Salut,

je maîtrise pas tout mais peut-on avec le fichier externe ExternalFunctions.txt appeler des procédures internes au programme rattaché via du VBSCRIPT (si j'ai bien compris) et si oui comment. Si t'as un exemple, je suis preneur pour bien comprendre. Pour être clair, on peut appeler un Form1.command1_click() par exemple ?

Je te remercie par avance et je pense que je vais te mettre une bonne note quand j'aurai un peu mieux compris comment ça fonctionne. Pour un débutant comme moi, c'est quand même un peu hard mais je vais m'accrocher !
xpert12 Messages postés 114 Date d'inscription lundi 5 février 2007 Statut Membre Dernière intervention 10 septembre 2010
29 avril 2010 à 22:11
Super,

j'avais vu cette source il y a quelques temps, mais j'avais pas eu le temps de m'y plonger dedans. Si je peux me permettre, tu devrais mettre une petite application en démo (et non un évaluateur d'expression incluant par exemple le module de cryptage/décryptage) pour q'un plus grand nombre puisse en profiter. je sais un truc du style :
DECLARE TEST§*NBRE1@NŠ*NBRE2@NŠ*NBRE3@NŠ*NBRE4@N

Function TEST (NBRE1,NBRE2,NBRE3,NBRE4)
TEST=NBRE1*NBRE2*NBRE3/NBRE4
end Function

Je ne suis pas sûr que tout le monde sache se dépatouiller une DLL!!!

Pour ma part, je vais la tester (et/ou la modifier) un peu pour voir ce qu'on peut en faire. Je te tiendrai sûrement au courant.

Bonne continuation et encore bravo !
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
18 juin 2008 à 10:13
@Flachy Joe: Mince 5135 download, c fou ca. J'ai regardé ton code mais je n'ai pas pu l'exécuter, mais j'ai parcouru le code et c'est vrai qu'on ressent la même problématique, celle d'appeler des fonctions externes et lui passer les paramètres. J'ai bien vu que tu as une gestion d'arguments et la création de fonction a 3 lignes (function ..., x=..., end funtion).

J'espère que tu pourras download ma source, elle est encore bien plus complexe, d'une grande flexibilité tu écris ton script dans le language que tu veux, et en réalité sert aussi de passerelle de mise à jour du logiciel. Elle a été concu pour être intelligente et independante.

En fait je developpe une application pour notre métier (services dans le domaine du Shipping et du Transit) qui doit gérer toutes les opérations de notre métier jusqu'à la facturation et pour toutes nos agences. Nous sommes dans plusieurs pays d'Afrique avec plusieurs langues, systèmes douaniers bien différents, des monnaies bien différentes, des comptabilités bien différentes, mais toutes les agences faisant dans notre métier. Le logiciel a été concu au départ pour une agence bien spécifique et a suscité de l'intérêt qui a conduit à ce que je sois à developper une applis pour toutes les agences devant être consolidé au siège. Pour ce faire il faut déjà un très bonne gestion des paramètres et uen application a structure modulaire mais avec un noyau commun non négociable. Alors cette DLL a été concu avec une idée bien précise de ce que je voulais ce qui a orienté mon analyse. Dans notre métier ce qui bouge regulièrement ce sont les tarifs. Je dois écrire un logiciel qui doit avoir l'intelligence de s'adapter à toute formule de tarif quelque soit les paramètres. C'est la raison pour laquelle toutes mes dernières sources sont orientés dans une vision globale, multi-paramètres externes et surtout intuitive, elles doivent pouvoir donner un résultat juste, indépendamment du logiciel qui l'utilise, voir mes source http://www.vbfrance.com/codes/UTILISATION-INTELLIGENTE-WORD-REALISER-ETATS_44998.aspx, http://www.vbfrance.com/codes/REQUETEUR-BASE-DONNEES-TRES-SIMPLE-UTILISATION-TRES-INTERESSANT_43966.aspx qui refletent bien cet esprit.
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
18 juin 2008 à 07:56
Mon "module de calcul" me servait juste à accélérer le tracé de graph à partir de leur équation, parce que le VBScript n'était pas au top.
Par contre, va faire un tour par là : http://www.vbfrance.com/codes/CALCULATRICE-GRAPHIQUE-VBS_28465.aspx
Tu trouvera sans doute des liens entre nos deux sources.
Le principe de la mienne est de créer une interface en VB à l'interpréteur VBS et de permettre au script d'exécuter des fonctions VB compilées.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
18 juin 2008 à 04:28
Sorry, petite confusion dans le commentaire ci-dessus, voir les corrections ci-dessous.

Apres tu utiliseras la méthode FunctionFormula ("RetourneExpression") pour avoir l'expression déjà ready pour le calcul ==> Apres tu utiliseras la méthode ExecuteFunctionStatement ("RetourneExpression") pour avoir l'expression déjà ready pour le calcul.

je repasses tous les paramètres à la DLL, après la seule chose à faire c'est d'utiliser la méthode FunctionFormula(NomDeLaFonction) ==> je repasses tous les paramètres à la DLL, après la seule chose à faire c'est d'utiliser la méthode ExecuteFunctionStatement (NomDeLaFonction)
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
18 juin 2008 à 04:13
@Flachy Joe : J'ai oublié de rajouter la DLL dans la source pour ceux qui n'aurait pas VB effectivement, ce n'est pas bien grave. Il ne s'agit pas d'un interpreteur perso, mais d'une DLL qui exploite le language de script, peu importe lequel. Tout ce que fait la DLL fait est de charger ton module externe ecrit dans un language de script, ton module ressemble à tout module que tu aurais pu écrire dans ton code original. Mais en entête de ton fichier externe texte ou tu as ecrit ton module, tu rajoutes les declarations afin que la DLL sache passer les paramètres à tes fonctions. La DLL ne chargera pas l'entête mais tout le reste.

L'intérêt de cette source ne réside pas seulement dans le fait de faire des calculs, c'est le moindre, mais surtout d'avoir trouvé le moyen d'utiliser dans son programme déjà compilé des fonctions et procedures externes de calcul qu'on a pas en compilant notre programme ou pour prévoir l'exécution des procédures de maintenance ou divers suivant les besoins ayant évoluer dans le temps. L'exemple du calcul des paramètres est une infine partie des possibilités mais la plus comprehensible pour tous. C'est la raison pour laquelle il était important de préciser aux utilisateurs de ma DLL de crypter le fichier texte qui a les intructions écrites en language de script. Dans mon cas c'est du VBScript mais il prend en compte tous les languages de script.

Ayant tenu compte du fait qu'il y'aurait des personnes ayant des préférences pour ses propres calculateurs, j'ai vu que tu en as écrit un, rien ne t'empeche de combiner avec le mien en ecrivant ce contenu dans le ficier texte:

DECLARE §*Expression@T|*Param1|*Param2|.....

function RetourneExpression(Expression, Param1, Param2, ...)
dim i, t

t=Expression
t=replace (t, "Param1", Param1)
t=replace (t, "Param2", Param2)
.
.
.

RetourneExpression=t
end function

Apres tu utiliseras la méthode FunctionFormula ("RetourneExpression") pour avoir l'expression déjà ready pour le calcul.

Dans mon le problème de lenteur ne se pose pas, car soit c'est de la maintenance ou divers que je vais executer à l'ouverture de l'appli, soit il s'agit du calcul d'un paramètre l'utilisateur du soft étant en général en situation d'attente. Si c'est de la facturation ce sera pour l'utilisateur juste le temps d'attendre que le programme calcule le montant de l'article, si l'article est configuré pour est calculé en Base * Taux, je n'appelle pas la DLL, mais si elle est paramétrer pour que le montant soit déduit suivant un calcul d'une certaine complexité qui a été définie après la compilation du programme alors j'utilise la DLL. Pour être rapide au démarrage j'informe ma DLL de toutes les paramètres de mon applis et suivant la requete dans mon programme executables, je repasses tous les paramètres à la DLL, après la seule chose à faire c'est d'utiliser la méthode FunctionFormula(NomDeLaFonction)

Cette DLL est l'objet d'une grosse analyse que beaucoup aurait gardé pour soi, mais par reconnaissance de toutes les connaissances acquises sur le site j'ai choisi de poster dans l'intégralité la même version de DLL que j'utilise mise à jour du 15/06/2008.

A+
ASIMENGO
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
17 juin 2008 à 22:22
Salut,
je n'ai pas regardé le code, je n'utilise plus VB d'ailleurs, mais juste par curiosité, tu as trouvé un moyen de faire les calculs en brut, tu utilises du VBScript ou tu à fait un interpréteur pour un langage perso ?
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
17 juin 2008 à 19:12
Note importante:

Il est important que le fichier Texte d'initialisation soit crypter, sinon des personnes malveillantes pourront changer le contenu des fonctions et causer de gros dommage.

Grace à Renfield j'ai ajouté à ma version un module de cryptage definit comme ci-dessous:

principe du cryptage
--------------------
lFreeFile = FreeFile
Open psCheminFichierSource For Input As #lFreeFile
Do While Not EOF(lFreeFile)
'Lit ligne par ligne le fichier texte
Line Input #lFreeFile, sLigneFichier
lNbreLignes = lNbreLignes + 1
ReDim Preserve aTbLignes(1 To lNbreLignes) As String
aTbLignes(lNbreLignes) = sLigneFichier
Loop
Close #lFreeFile

Open psCheminFichierDestination For Binary Access Write As #lFreeFile
Put #lFreeFile, , Crypto(Join(aTbLignes(), vbCrLf), True)
Close #lFreeFile


principe du decrytage
--------------------
lFreeFile = FreeFile
Open psCheminFichierSource For Binary Access Read Lock Read As #lFreeFile
sLigneFichier = String(LOF(lFreeFile), " ")
Get #lFreeFile, , sLigneFichier
Close #lFreeFile

aTbLignes = Split(sLigneFichier, vbCrLf)

For i = 0 To UBound(aTbLignes)
DeaTbLignes(i)= Crypto(aTbLignes(i), False)
Next i

A+
ASIMENGO
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
16 juin 2008 à 10:55
Je vais expliquer un peu mieux cmt optimiser l'utilisation de cette DLL.
Au demarrage de votre applis, appeler cette DLL qui charge un fichier texte sur le disque contenant les fonctions additionnelles. Si un jour il y'a des nouvelles fonctions il suffit de modifier texte.

Au chargement votre applis via cette DLL, charge vos nouveaux fonctions et procedures, comme si elles faisaient parties du programme au départ. Mais j'ai mis au point une syntaxe qui permet à la DLL d'apprendre les paramètres des fonctions et procédures (Nom Paramètre, Type, Valeur par défaut, paramètre optionnel ou pas). Ces declarations doivent toujours être à l'entête du fichier texte. Cette zone de déclaration permettra également de définir des variables pour le programme. Toutes les variables sont visibles dans tous les modules ajouter à DLL. on peut ajouter plusieurs modules égaleemnt, mais en envoyant le texte, ar contre au démarrage, la DLL est initialisée par un module dans un fichier texte

Imaginons que notre appli manipule des paramètres dont le mode de calcul est quelconque. Comment utiliser la DLL?.

1 - dans votre programme il faut déjà avoir une table de correspondance <Nom Parametre>, <Nom Fonction>
2 - Appeler la propriété ParametersName pour avoir la liste des paramètres il renverra un tableau à un dimension avec la liste de nom de paramètre
3 - Faire une boucle dans votre programme, si le nom du paramètre correspond à quelque chose pour vous alors utiliser la propriété Let VariableValue pour donner une valeur à cette varaible. on pourra utiliser la propriété IsVariableInitialized pour savoir si la variable a déjà été initialisée.
4 - Appeler la méthode ExecuteFunctionStatement pour avoir le résultat de la fonction.

NB : La DLL est suffisament intelligente pour savoir quels sont les paramètres dont il ne connait pas la valeur, alors il envera un inputbox pour que l'utilisateur donne la valeur. Mais au fait j'y pense, le mieux serait d'envoyer un form avec la liste des paramètres et leur valeur, déjà pour le user du soft de contrôler les paramètres avant de lancer le calcul
Sur ce il faut ajouter 1 variable à la méthode ExecuteFunctionStatement pour indiquer si on veut afficher le form, il passera cette étape quand tous les paramètres sont initialisés et un autre paramètre pour indiquer si un paramètre peut être modifié par le user du soft.

Je pense que mes explications sont assez claires pour le focntionnement de cette DLL

A+
ASIMENGO
Rejoignez-nous