cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 2013
-
25 juin 2007 à 18:54
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDerniè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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 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)
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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.
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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 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