Comment utiliser CallByName dans une DLL

Résolu
Signaler
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Bonjour à tous

J'ai appris grace à ce forum a utiliser la fonction "CallByName" qui me permet d'appeler une fonction grace à une variable.
Le probleme c'est que la fonction que je veux appeler est à l'interieur d'une DLL.

Comment puis-je m'y prendre et comment paramettrer cette geniale fonction.

Private Declare Function lstrcpy Lib "Kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Function CryptageP1M1 Lib "P1M1.dll" (ByVal a As String) As Long
Private Declare Function DecryptageP1M1 Lib "P1M1.dll" (ByVal a As String) As Long

Public Sub Form_Load()
 
 Codage = "P1M1"
 PhraseACoder = "Coucou"
 MsgBox PhraseACoder, vbOKOnly, "Phrase d'originale"
 PhraseCoder = CoderAlpha(Codage, PhraseACoder)
 MsgBox PhraseCoder, vbOKOnly, "Retour Dll phrase codée par " + Codage
 PhraseDecoder = DecoderAlpha(Codage, SupCabalistiqueFinal(PhraseCoder))
 MsgBox PhraseDecoder, vbOKOnly, "Retour Dll phrase décodée par " + Codage
 
End Sub'                   CODAGE/DECODAGE ALPHANUMERIQUE
'                   ******************************

Function CoderAlpha(Codage , PhraseACoder)
 
 Dim ChaineDll As String * 400
 Dim RetourDll As Long
 Dim AdresseChaine As Long
 ChDrive (Left(CurrentProject.Path, 1))
 ChDir CurrentProject.Path
 
 If Dir(CurrentProject.Path + "" + Codage + ".dll") <> "" Then
  Cryptage = "Cryptage" + Trim(Codage)
  RetourDll = CallByName(Me, Cryptage, VbMethod, PhraseACoder)
  AdresseChaine = lstrcpy(ChaineDll, RetourDll)
  CoderAlpha = ChaineDll
 Else
  MsgBox "La Dll " + Codage + ".Dll" + " est absente de " + CurDir
 End If
 
End Function

Function DecoderAlpha(Codage, PhraseADecoder) ' Fonction à l'interieur de la fonction DecryptageP1M1
 
 Dim ChaineDll As String * 400
 Dim AdresseChaine As Long
 Dim RetourDll As String
 ChDrive (Left(CurrentProject.Path, 1))
 ChDir CurrentProject.Path
 
 If Dir(CurrentProject.Path + "" + Codage + ".dll") <> "" Then
  Decryptage = "Decryptage" + Trim(Codage)
  RetourDll = CallByName(Me, Decryptage, VbMethod, PhraseADecoder) 'Que dois-je mettre à la place de "Me" ?
  AdresseChaine = lstrcpy(ChaineDll, RetourDll)
  DecoderAlpha = ChaineDll
 Else
  MsgBox "La Dll " + Codage + ".Dll" + " est absente de " + CurDir
 End If
 
End Function

Merci
Bonne journée

10 réponses

Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
Merci...

on pourrait passer par GetProcAdress, et invoquer la fonction de cryptage en utilisant son pointeur...
mais c'est un peu plus complexe.

tiens, j'ai fait ça, rapidement, vois à developper pour le decryptage, et pour le reste...

bonne continuation.

Private Declare Function lstrcpy Lib "Kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function API_CryptageP1M1 Lib "P1M1.dll" Alias "CryptageP1M1" (ByVal a As String) As Long
Private Declare Function API_DecryptageP1M1 Lib "P1M1.dll" Alias "DecryptageP1M1" (ByVal a As String) As Long
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long

Public Function CryptageP1M1(ByVal a As String) As Long
   CryptageP1M1 = API_CryptageP1M1(a)
End Function<hr />
Public Function DecryptageP1M1(ByVal a As String) As Long
   DecryptageP1M1 = API_DecryptageP1M1(a)
End Function<hr />
Public Function CoderAlpha(ByRef Codage As String, ByRef PhraseACoder As String) As String
Dim nPtr As Long
Dim hLib As Long
   '# Est-ce que la dll peut etre chargée (quel que soit son emplacement, dans le repertoire du projet,
   '# de VB6.exe ou dans System32...
   hLib = LoadLibrary(Codage & ".dll")
   If hLib Then
       '# La dll a pu être chargée. On la libère.
       FreeLibrary hLib
       
       '# On appelle la fonction 'CryptageP1M1' de la form.
       nPtr = CallByName(Me, "Cryptage" & Trim$(Codage), VbMethod, PhraseACoder)
       
       '# On récupère le texte crypté, à partir du pointeur retourné par 'CryptageP1M1'
       CoderAlpha = Space$(lstrlen(nPtr))
       lstrcpy CoderAlpha, nPtr
    Else
       MsgBox "La Dll de cryptage '" & Codage & ".Dll' n'a pas été trouvée."
   End If
End Function<hr />
Private Sub Form_Load()
   MsgBox CoderAlpha("P1M1", "test")
End Sub<hr />, ----
By Renfield

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
CallByName appelle les methodes et propriétés d'un objet.
fais un warper vers tes fonctions dans ta Form, et utilises CallByName pour invoquer ce Warper.

NB, tu dois pouvoir trouver un meilleur moyen que d'utiliser CallByName
NB2, ON NE CONCAT7NE PAS AVEC '+' utilises '&'


tu peux par exemple changer ta dll, pour faire des fonction de codage/decodage plus génériques, et passer en parametre le type d'encodage décodage


enfin, ce nest qu'une suggestion...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Bonjour Renfield

Je suis content de te parler.
J'ai oublié de te dire que j'etais vraiment un debutant.

La "Combine" de callbyname m'a été donnée sur ce POST :

http://www.vbfrance.com/infomsg_NOM-FONCTION-DANS-VARIABLE_954166.aspx

Moi en fait ce que je cherchais a faire c'est pouvoir appeller une fonction dans une DLL standard toute simple non-ActiveX.

La seule explication que j'ai comprise dans ta reponse c'est :
ON NE CONCAT7NE PAS AVEC '+' utilises '&'

Le reste est un peu trop haut niveau pour ma petite tete.
Pourrais tu me donner un exemple simple, ou une explication ou un lien sur les precieux conseils que tu viens de me donner.

Je te remercie beaucoup de ta gentillesse, et je te felicite pour ton savoir que je lis sur tous les nombreux POST ou tu aide les ames perdues comme moi avec competence et patience.

Encore merci et bravo.
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Mille merci Renfield.
Tu peux pas savoir ce que ce code me depanne.
Je commençais à desesperer.

J'essayais depuis noir de temps de creer et utiliser une DLL que je ne sois pas obligé d'enregistrer dans la BDR.
Et apparement avec VB et ses DLL activeX on est obligé.

Le bleme c'est que sur les PC sur lesquels je travaille, ils sont bridés et donc ecrire dans  la BDR c'est risqué.

J'ai donc eu l'idée de créer une DLL simple non ActiveX avec un autre language et l'utiliser avec VB.
Mais ce qui est simple avec cet autre language est compliqué avec VB.

Je te remercie beaucoup de ta gentillesse et ta générosité.
J'aimerais pouvoir te dire que je te le rendrais un jour, mais vu mon niveau .........
Je t'aurais bien payé un coup à boire pour te remercier, mais la aussi, c'est la barriere des kms qui va nous separer.

Donc tu devras te contenter d'un immense

MERCI

Du fond du coeur.
Et au plaisir d'avoir l'honneur de te reparler un jour.

Excelente journée à toi
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
euh.... bah, de rien ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Et en plus modeste,  aaaaaarffff si un jour je pouvais au bout de 3 vies d'entrainement je pouvais avoir le 1/4 de ton savoir.....
C'est pas interdit de rever ...

Dis moi, je me suis pas trompé dans l'histoire des DLL activeX VB et les DLL standard style celle du C.
Y'en a bien une qu'on est obligé de modifier la BDR et pas l'autre ????
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
exactement, les dll ActiveX s'enregistrenet (via RegSvr32)
les, autres, ne font qu'exporter des fonctions et là, c'est le nom dui fichier dll et son emplacement qui comptent

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Bon, je progresse j'essaie de sortir des sous-sols de la prog.
Je vais bientot atteindre le niveau 0

Ton code marche nickel.
Je suppose que ce que tu appellais "Warper" c'est ces deux lignes :

Public Function CryptageP1M1(ByVal a As String) As Long
   CryptageP1M1 = API_CryptageP1M1(a)
End Function





<hr />




Public Function
DecryptageP1M1(ByVal a As String) As Long
   DecryptageP1M1 = API_DecryptageP1M1(a)
End Function

C'est à dire que comme on peux pas appeller les fonctions directement dans la DLL, tu les fait "passer" par la form pour que le "me" de la fonction callbyname puisse fonctionner.


J'ai tous juste ou tout faux ???


Deuxieme question (Pendant que je te tiens ) on peut pas les inclure dans les deux autres fonctions, je suppose de façon a ne pas avoir 4 fonctions a trainer ...
Les deux du dessus + le decrypt + le crypt = 4


 




 
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
ok sur le wrapper

ont pourrais appeler les API directment, en obtenant un pointeur vers ces fonctions, mais c'est assez complexe,
mais faisable... (voir els source de EBArtSoft, qui a expliqué sur le site comment appeler une fonction depuis sont pointeur...)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
J'suis content j'ai un peu compris
Merci pour tous tes precieux conseils.

Bonne journée a toi