我需要为 DLL 创建一个包装器,根据需要加载和卸载它(对于那些对这个问题的背景感兴趣的人,请参阅如何解决 Tomcat 应用程序访问的内存泄漏第 3 方 DLL(无源代码)?)。我在 Visual Basic 6 中执行此操作,并且使用以下示例进行加载和卸载:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) 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
Run Code Online (Sandbox Code Playgroud)
我可以使用Process Explorer看到,当显示消息框时,DLL 被加载到内存中,然后被丢弃。然而,调用方法自然是不够的——我需要访问动态加载的 DLL 中的方法。
我怎样才能实现这个目标?我想调用 TestDLL 中 mainClass 类中的方法 getVersion,如下所示:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Sub cmdTestLoadingDLL_Click()
Dim lb As Long, pa As Long
Dim versionString As String
lb = LoadLibrary("D:\projects\other\VB_DLLs\TestDLL\TestDLL.dll")
versionString = "- From DLL: " + mainClass.getVersion
MsgBox versionString
FreeLibrary lb
End Sub
Run Code Online (Sandbox Code Playgroud)
然而,该行
versionString = "- From DLL: " + mainClass.getVersion
Run Code Online (Sandbox Code Playgroud)
抛出错误“需要对象”。
首先,由于您是通过 LoadLibrary 调用它,因此这里没有类 - 仅导出函数以供公共使用。所以你的 mainClass 引用永远不会起作用。假设您有一个导出的函数getVersion 。
我会尝试以下操作:
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) 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 versionString As String
Dim retValue as Long
lb = LoadLibrary("D:\projects\other\VB_DLLs\TestDLL\TestDLL.dll")
'retrieve 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
Run Code Online (Sandbox Code Playgroud)