Accès à la DLL chargée dynamicment (avec LoadLibrary) dans Visual Basic 6

J’ai besoin de créer un wrapper pour une DLL, en le chargeant et en le déchargeant si nécessaire (pour ceux qui s’intéressent à l’arrière-plan de cette question, voir Comment contourner la DLL tierce partie fuyant (sans code source) accessible par l’application Tomcat)? ). Je le fais dans Visual Basic 6, et le chargement et déchargement avec l’exemple suivant fonctionne:

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As Ssortingng) As Long Private Sub cmdTestLoadingDLL_Click() Dim lb As Long, pa As Long lb = LoadLibrary("D:\projects\other\VB_DLLs\TestDLL\TestDLL.dll") Msgbox "Library address: " + lb FreeLibrary lb End Sub 

Je peux voir à l’aide de l’Explorateur de processus que la DLL est chargée en mémoire lorsque la boîte de message est affichée et est supprimée par la suite. Cependant, l’appel de la méthode n’est naturellement pas suffisant – j’ai besoin d’accéder aux méthodes dans la DLL chargée dynamicment.

Comment puis-je atteindre cet objective? Je voudrais appeler la méthode getVersion dans la classe mainClass, qui est dans TestDLL, comme ceci:

 Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As Ssortingng) As Long Private Sub cmdTestLoadingDLL_Click() Dim lb As Long, pa As Long Dim versionSsortingng As Ssortingng lb = LoadLibrary("D:\projects\other\VB_DLLs\TestDLL\TestDLL.dll") versionSsortingng = "- From DLL: " + mainClass.getVersion MsgBox versionSsortingng FreeLibrary lb End Sub 

Cependant, la ligne

 versionSsortingng = "- From DLL: " + mainClass.getVersion 

jette une erreur “Objet requirejs”.

Tout d’abord, puisque vous l’appelez via LoadLibrary, il n’y a pas de classes ici – seules les fonctions sont exscopes pour la consommation publique. Donc, votre référence mainClass ne fonctionnerait jamais. Supposons que vous avez une fonction getVersion qui est exscope.

Je voudrais essayer ce qui suit:

 Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As Ssortingng) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As Ssortingng) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long Private Sub Foo On Error Resume Next Dim lb As Long, pa As Long Dim versionSsortingng As Ssortingng Dim retValue as Long lb = LoadLibrary("D:\projects\other\VB_DLLs\TestDLL\TestDLL.dll") 'resortingeve the address of getVersion' pa = GetProcAddress(lb, "getVersion") 'Call the getVersion function' retValue = CallWindowProc (pa, Me.hWnd, "I want my version", ByVal 0&, ByVal 0&) 'release the library' FreeLibrary lb End Sub 

Avez-vous besoin d’appeler les méthodes COM sur cette DLL? Si oui, je ne suis pas du tout sûr que cela soit possible.

  • L’excellent Advanced Visual Basic 6 de Matthew Curland est le premier endroit que je chercherais, cependant. Il y a de puissants éléments COM sous-jacents qui contournent les techniques VB6 normales.

  • Il y a aussi DirectCom , qui vous permet d’appeler des méthodes COM sans utiliser COM. Je ne l’ai jamais utilisé moi-même, mais les gens en parlent sur le groupe de discussion VB6.