Appel DLL dans un module ne marche pas

cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 25 juin 2007 à 18:54
cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 26 juin 2007 à 12:17
Bonjour à tous

Voila, suite a plusieurs POSTS dans ce Forum, j'ai essayé de faire appel a ma DLL non-activeX qui a été crée par un autre language que VB.

Le code marche tres bien quand il est dans une FORM.

Par contre, j'aurais aimé le mettre dans un module pour qu'il soit accessible dans tout le programme.
Helas, malgré que j'ai essayé de suivre tous les conseils de ce forum, j'ai une erreur :
"Variable objet ou variable bloc non definie" à la ligne
ClasseCryptDec.ChargeTablo ' Chargement du tableau de codage contenu dans la DLL
Et lorsque je pointe dans la ligne Public ClasseCryptDec As CryDec le mot ClasseCryptDec j'ai le retour Nothing.
Je pense que cela viens de là
J'ai cherché pendant une journée sans succes, ou aurai-je bien pu fais une erreur ??

Code de la FORM

 
Public Sub Form_Load()
  
 Dim PhraseACoder As String, Codage As String, a As String
 Codage = "Codage1"
 PhraseACoder = "test"
 ClasseCryptDec.ChargeTablo ' Chargement du tableau de codage contenu dans la DLL
 MsgBox PhraseACoder, vbOKOnly, "Phrase à coder"
 a = ClasseCryptDec.CoderAlpha("MaDll.dll", Codage, PhraseACoder) ' Codage de la phrase a l'interieur de la DLL
 MsgBox a, vbOKOnly, "Phrase codée"
 MsgBox ClasseCryptDec.DecoderAlpha("MaDll.dll", "Codage1", a), vbOKOnly, "Phrase décodée" ' Décodage de la phrase a l'interieur de la DLL
 
End Sub

Code du module déclaration des variables

Public Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Public Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Public Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long



Public Declare Function CryptageCodage1 Lib "MaDll.dll" Alias "DllCryptageCodage1" (ByVal a As String) As Long
Public Declare Function DecryptageCodage1 Lib "MaDll.dll" Alias "DllDecryptageCodage1" (ByVal a As String) As Long
Public Declare Function CryptageCodage3 Lib "MaDll.dll" Alias "DllCryptageCodage3" (ByVal a As String) As Long
Public Declare Function DecryptageCodage3 Lib "MaDll.dll" Alias "DllDecryptageCodage3" (ByVal a As String) As Long
Public Declare Function DllTabloCodage Lib "MaDll.dll" () As Long



'déclarations API (pour les deux fonctions PEEK et POKE)
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Bytes As Long)



' Declaration du module perso de classe CryDec
Public ClasseCryptDec As CryDec

Code du module de classe CryDec.cls

' ****************************************************************************************
'                         FONCTION DE CRYPTAGE DANS LA DLL
' ****************************************************************************************



Public Function DllCryptageCodage1(ByVal a As String) As Long
 DllCryptageCodage1 = CryptageCodage1(a)
End Function



Public Function DllCryptageCodage3(ByVal a As String) As Long
 DllCryptageCodage3 = CryptageCodage3(a)
End Function



Public Function CoderAlpha(NomDll As String, ByVal Codage As String, PhraseACoder As String) As String
 
 Dim nPtr As Long
 Dim hLib As Long
 hLib = LoadLibrary(NomDll)
 
 If hLib Then
  FreeLibrary hLib
  nPtr = CallByName(Me, "DllCryptage" & Trim$(Codage), VbMethod, PhraseACoder)
  CoderAlpha = Space$(lstrlen(nPtr))
  lstrcpy CoderAlpha, nPtr
 Else
  MsgBox "La Dll de cryptage '" & NomDll & " n'a pas été trouvée."
 End If
 
End Function



' ****************************************************************************************
'                         FONCTION DE DECRYPTAGE DANS LA DLL
' ****************************************************************************************



Public Function DllDecryptageCodage1(ByVal a As String) As Long
 DllDecryptageCodage1 = DecryptageCodage1(a)
End Function



Public Function DllDecryptageCodage3(ByVal a As String) As Long
 DllDecryptageCodage3 = DecryptageCodage3(a)
End Function



Public Function DecoderAlpha(ByVal NomDll As String, ByVal Codage As String, ByVal PhraseADecoder As String) As String
 
 Dim nPtr As Long
 Dim hLib As Long
 hLib = LoadLibrary(NomDll)
 
 If hLib Then
  FreeLibrary hLib
  nPtr = CallByName(Me, "DllDecryptage" & Trim$(Codage), VbMethod, PhraseADecoder)
  DecoderAlpha = Space$(lstrlen(nPtr))
  lstrcpy DecoderAlpha, nPtr
 Else
  MsgBox "La Dll de cryptage '" & NomDll & " n'a pas été trouvée."
 End If
 
End Function



' ****************************************************************************************
'                  FONCTION DE LECTURE TABLEAU DANS LA DLL
' ****************************************************************************************
 
Public Function PeekL(ByVal Addresse As Long) As Variant
 Dim valueL As Long
 CopyMemory valueL, ByVal Addresse, 4
 PeekL = valueL
End Function



Public Function PeekB(ByVal Addresse As Long) As Variant
 Dim valueB As Byte
 CopyMemory valueB, ByVal Addresse, 1
 PeekB = valueB
End Function



Public Sub ChargeTablo()
 
 Dim TabloExeCodage(100)
 Dim TailleTabloCodage As Long, AdresseTabloCodage As Long
 AdresseTabloCodage = DllTabloCodage()
 TailleTabloCodage = PeekL(AdresseTabloCodage - 8) - 1
 
 For Element = 1 To TailleTabloCodage
 
  AdresseElement = PeekL(AdresseTabloCodage + (Element * 4))
 
  For u = 0 To 20
 
   TabloExeCodage(Element) = TabloExeCodage(Element) + Chr(PeekB(AdresseElement + u))
  
   If PeekB(AdresseElement + u) = 0 Then Exit For
 
  Next
 
  PhraseTablo = PhraseTablo + " " + Left(TabloExeCodage(Element), Len(TabloExeCodage(Element)) - 1)
 
 Next
 
 MsgBox PhraseTablo
 
End Sub


Je vous remercie de votre aide
Je vous souhaite une bonne journée



 


 




 













 

3 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
25 juin 2007 à 19:28
Salut
Je n'ai pas eu le courage de tout décrypter, mais il y a des choses bizarres dans ton explication :
Tu parles de DLL non créée avec VB alors que tu en fournis le listing ensuite.
En fait, tu créées une classe qui va faire le boulot d'adressage à cette fameuse DLL, mais il ne faut pas la considérer elle même comme une DLL, ce n'est qu'une classe. Donc, pas de déclaration comme celle-ci, ça n'a pas de sens :
Public Declare Function CryptageCodage1 Lib "MaDll.dll" Alias "DllCryptageCodage1" (ByVal a As String) As Long
Essaie simplement de déclarer la DLL en référence dans ton application, sans rien déclarer, et instancie ta classe normalement.
En fait, c'est même extraordinaire que cela fonctionne dans ta Form, vu le manque de déclaration.
Dimensionnement des classes : Utilise le mot New, puis un Set quand tu débute (voir l'aide de vb)

Vérifie aussi que tu n'as pas un problème de With-EndWith, For-Next, If-Then qui serait incomplet, cela peut donner des erreurs comme celle-ci.

Autres conseils :
- Toujours utiliser la déclaration obligatoire des variables dans tes codes. C'est chiant à gérer, mais ça évite ce genre de recherche et ça simplifie le travail du compilateur.
- En mode IDE, lance toujours ton application avec Ctrl-F5 et pas F5 seul : VB compilera avant de lancer l'appli et détectera les problèmes avant de les rencontrer = gain de temps

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
25 juin 2007 à 22:46
Bonsoir Jack
Merci de ton aide

En fait, je ne fournis pas le code de la DLL dans laquelle, il y a une fonction de cryptage.
Il est vrai que le commentaire pourrait le faire croire, mais quand j'ecris "FONCTION DE CRYPTAGE DANS LA DLL" je veux dire APPEL DE LA FONCTION DE CRYPTAGE QUI SE SITUE DANS LA DLL.

Je n'y connait rien en classe, (comme quand j'etais a l'ecole d'ailleur), mais j'avais pris ce code dans le forum.
Je ne sais pas du tout m'en servir, a tel point qu'avant cet exemple j'ai eu beau lire et essayer de comprendre a quoi ça servait j'y comprenais toujours rien.
Maintenant, j'ai a peu pres compris que le module de classe se transforme en objet au meme titre qu'une forme ou un bouton, et peut donc etre exporté dans n'importe quelle application.Je sais pas si j'ai bien compris d'ailleur.

Je vais essayer d'appliquer tes conseils demain matin.
Si je n'y arrive pas je posterais le code qui marche avec la form, pour que vous puissiez voir et peut etre mieux comprendre ce que j'aurais aimé faire.

Encore merci de ta precieuse aide
Bonne soirée
0
cs_andrebernard Messages postés 406 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
26 juin 2007 à 12:17
J'ai tenté de suivre les conseils de Jack,mais apparement rien de mieux 






Voici le code qui fonctionne seulement dans une FORM.
Ce code est de Renfield:



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 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
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 TabloCodage Lib "P1M1.dll" () As Long
'déclarations API (pour les deux fonctions PEEK et POKE)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Bytes As Long)



Dim a As String, Codage As String, TabloExeCodage(100) As String
Dim TailleTabloCodage As Long, AdresseElement As Long, AdresseTabloCodage As Long
 
Function PeekL(ByVal Addresse As Long) As Variant
 Dim valueL As Long
 CopyMemory valueL, ByVal Addresse, 4
 PeekL = valueL
End Function



Function PeekB(ByVal Addresse As Long) As Variant
 Dim valueB As Byte
 CopyMemory valueB, ByVal Addresse, 1
 PeekB = valueB
End Function



Public Sub ChargeTablo()
 
 AdresseTabloCodage = TabloCodage()
 TailleTabloCodage = PeekL(AdresseTabloCodage - 8) - 1
 
 For Element = 1 To TailleTabloCodage
 
  AdresseElement = PeekL(AdresseTabloCodage + (Element * 4))
 
  For u = 0 To 20
 
   TabloExeCodage(Element) = TabloExeCodage(Element) + Chr(PeekB(AdresseElement + u))
  
   If PeekB(AdresseElement + u) = 0 Then Exit For
 
  Next
 
  PhraseTablo = PhraseTablo + " " + Left(TabloExeCodage(Element), Len(TabloExeCodage(Element)) - 1)
 
 Next
 
 MsgBox PhraseTablo
 
End Sub



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



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



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



Public Function DecoderAlpha(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, "Decryptage" & Trim$(Codage), VbMethod, PhraseACoder)
       
  '# On récupère le texte crypté, à partir du pointeur retourné par 'CryptageP1M1'
  DecoderAlpha = Space$(lstrlen(nPtr))
  lstrcpy DecoderAlpha, nPtr
 Else
  MsgBox "La Dll de cryptage '" & Codage & ".Dll' n'a pas été trouvée."
 End If
 
End Function



Private Sub Form_Load()



 Dim PhraseACoder As String
 Codage = "P1M1"
 PhraseACoder = "test"
 ChargeTablo ' Chargement du tableau de codage contenu dans la DLL
 MsgBox PhraseACoder, vbOKOnly, "Phrase à coder"
 a = CoderAlpha(Codage, PhraseACoder) ' Codage de la phrase a l'interieur de la DLL
 MsgBox a, vbOKOnly, "Phrase codée"
 MsgBox DecoderAlpha("P1M1", a), vbOKOnly, "Phrase décodée" ' Décodage de la phrase a l'interieur de la DLL
 
End Sub




Comment faire pour l'inserer dans un module afin qu'il soit accessible par tous le programme

Merci de votre aide
0