Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :VBScript Classé sous : script, eval, calcul, dll, ASIMENGO Niveau : Initié Date de création : 15/06/2008 Date de mise à jour : 16/06/2008 10:32:54 Vu / téléchargé: 4 987 / 386

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Depuis longtemps que je me ronge les méninges pour trouver le moyen d'executer des fonctions/procedures externes à partir d'un EXE.

Je travaille sur un logiciel de suivi des operations. Chaque opération est basé sur des rubriques et à chaque rubrique peut correspondrent une dépense dont le mode de calcul est quelconque. Le but étant d'automatiser le processus, les rubriques sont diverses et evoluent dans le temps. Pour la plupart des logiciels le mode de calcul est codé en dur dans le programme, si pas le cas alors on sort sa calculette. Certains logiciels ont un éditeur de formule qui ne résolvra pas également tous les cas de figure. En général on arrivera à automatiser les montants calculables sous la formule Base*Taux, mais comme exemple les calculs qui font déjà allusion à la franchise, le nombre de jour, taux variable alors l'éditeur de formule n'y parviendra pas forcement.
Cette DLL en exploitant le language des scripts vous permettra de résoudre tous les cas de figures.

En effet on peut consigner les fonctions dans un fichier texte dans un language de script choisi et il suffira d'indiquer le chemin à la méthode Init de la DLL.

Mais attention, pas de soulagement, il faut bien apprendre à la DLL à reconnaitre et à passer les paramètres. J'ai mis au point une syntaxe qui permettra à la DLL d'intérroger vos fonctions.

Le fichier texte doit contenir en entête les déclarations des fonctions et variables sous la forme
DECLARE <Nom Fonction>§*<Nom Champ1>=[Valeur Par Défaut]@<Type Variable>¦§*<Nom Champ2>=[Valeur Par Défaut]@<Type Variable>¦...

<Nom Fonction> : Nom de la fonction. Si omis il s'agit d'une simple déclaration de variables
* : Facultatif, permet de dire si le paramètre de fonction est facultatif
= : Permet de définir à droite la valeur par défaut de la variable
@ : permet de définir à droite le type de la variable. Les valeurs possibles (T=Texte, N=Numerique, D=Date, B=Booléen, V=Variant)
¦ : Séparateur de paramètres de la fonction

Exemple
-------
DECLARE §*POIDS@N¦*VOLUME@N¦*NBRECOLIS@N¦*NBRE20FT@N¦*NBRE40FT@N¦*FRANCHISE@N¦*NBREJOURS@N¦*TAUX=0@N
DECLARE TEUS§*NBRE20FT@N¦*NBRE40FT@N

La DLL comprend un certain nombre de méthodes et propriétés permettant une manipulation avec une très grande aisance.

Méthodes:
--------
Public Function AddModuleDefinition(ByVal psModuleText As String) As Boolean
Public Function ClearVariableValue(ByVal pvVariableName As Variant) As Boolean
Public Function ExecuteFunctionStatement(ByVal psFunctionName As String) As Variant
Public Function FunctionFormula(ByVal psFunctionName As String, Optional ByVal pbAskParameterValue As Boolean = True) As String
Public Function Init(Optional ByVal psFunctionsFilePath As String, Optional ByVal psVBScriptLanguage As String = "VBScript") As Boolean
Public Function IsValueMatchVariableType(ByVal pvVariableName As Variant, pvValue As Variant) As Boolean

Propriétés
----------
Public Property Get FunctionsCount() As Long
Public Property Get FunctionsNames() As Variant
Public Property Get IsVariableInitialized(ByVal pvVariableName As Variant) As Boolean
Public Property Get ParametersName(ByVal psFunctionName As String) As Variant
Public Property Get VariablesCount() As Long
Public Property Get VariablesNames(Optional ByVal psVariableType As String = vbNullString) As Variant
Public Property Let VariableValue(ByVal pvVariableName As Variant, pvVariableValue As Variant)
Public Property Get VariableValue(ByVal pvVariableName As Variant) As Variant

J'ai rajouté un projet exemple pour montrer l'exploitation de la DLL.

 

Source

  • REM Tout est dans la DLL, ci-dessous un exemple de bout de code montrant la recupération du résultat
  • Private Sub Command1_Click()
  • Dim vResult As Variant
  • vResult = clsx.ExecuteFunctionStatement([List_Fonctions])
  • If Not IsEmpty(vResult) Then MsgBox vResult
  • [Label3].Caption = clsx.FunctionFormula([List_Fonctions], False)
  • Call List_Parametres_Click
  • End Sub
REM Tout est dans la DLL, ci-dessous un exemple de bout de code montrant la recupération du résultat

Private Sub Command1_Click()
Dim vResult As Variant
    
    vResult = clsx.ExecuteFunctionStatement([List_Fonctions])
    If Not IsEmpty(vResult) Then MsgBox vResult
    [Label3].Caption = clsx.FunctionFormula([List_Fonctions], False)
    Call List_Parametres_Click
End Sub

Conclusion

Cette DLL est une petite merveille, l'essayer c'est l'adopter.
J'espère avoir vos critiques et commentaires.

ASIMENGO.


 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

16 juin 2008 10:32:54 :
Titre plus explicatif

Commentaires et avis

signaler à un administrateur
Commentaire de asimengo le 16/06/2008 10:55:30

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

signaler à un administrateur
Commentaire de asimengo le 17/06/2008 19:12:44

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

signaler à un administrateur
Commentaire de Flachy Joe le 17/06/2008 22:22:49

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 ?

signaler à un administrateur
Commentaire de asimengo le 18/06/2008 04:13:49

@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

signaler à un administrateur
Commentaire de asimengo le 18/06/2008 04:28:02

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)

signaler à un administrateur
Commentaire de Flachy Joe le 18/06/2008 07:56:39

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.

signaler à un administrateur
Commentaire de asimengo le 18/06/2008 10:13:15

@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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

une question svp [ par sn4p ] bonjour, et tout d'abord je voudrais dire que e site est tr&#232;s bien fait et surtout tr&#232;s complet :) j'aurais une question voil&#224;, par ex compilation de script ASP en DLL [ par BigNas ] Bonjour à Tous, Y'a-t-il qlq'1 qui a pu compiler des scripts ASP en DLL moyennant VB 6 ? Fabriquer une DLL de calcul [ par rambc ] Comment crée-t-on une DLL ? Je voudrais faire une DLL pour calculer sur des matrices et des GRANDS nombres. Le langage C++ permet-il cela ? Quelqu'un Comment decharger une DLL ??? [ par mouse74 ] Bonjour,J'ai un gros problème. Voilà, mon programme VB fait appel à une dll fortran, tout fonctionne bien sauf que si je lance deux calculs de suite, dll statistique [ par alonsyl ] bonjour,j'aimerais savoir s'il existe une dll permettant le calcul de fonctions statistiques (gaussienne, beta, fisher notamment).sinon, connaitriez-v Vb6fr.dll [ par petchy ] bonjourcomment faire,pour que &#224; l'installation d'un prog en VB6 il me copie VB6FR.DLL dans le fichier systeme et si il existe de ne pas le copier Problème DLL .NET [ par kamui74 ] BonjourJe suis en train de faire une appli en vb.net et je dois utiliser une dll que j'ai r&#233;&#233;crit&nbsp;en .NET (je l'utilisais sous vb6 et&n vb script [ par mboudllal ] bonjourdites moi les amis c koi le vb scripte et comment on peut les utiliser, et si vous avez des exemples n'hesitez pas de me les donner&nbsp;&nbsp; enregistrement .DLL [ par petchy ] bonsoirest ce possible qu'au lancement de mon programme,je puisse enregistrer des .DLL,si oui,pouvez vous m'indiquer comment faire.merci@ pluspetchy Cherche INFO sur > U S E R 3 2 . DLL < ? os XP pour VB [ par Bubar92Bubar92 ] Bonjour Dans VBfrance j ai trouver pas mal d'exemple je m'en sert 'FORM TRANSPARENTE' et 'FORM AU PREMIER PLAN' sont incompatible donc je cherche des


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.