在Visual Basic 6中访问dynamic加载的DLL(使用LoadLibrary)

我有一个需要创build一个DLL的包装,根据需要加载和卸载(对于这个问题的背景感兴趣,请参阅如何解决由Tomcat应用程序访问内存泄漏第三方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 

我可以看到使用Process Explorer在显示消息框时将DLL加载到内存中,之后被丢弃。 但是,调用方法自然是不够的 – 我需要访问dynamic加载的DLL中的方法。

我怎样才能做到这一点? 我想调用TestClass类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 

但是,行

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

抛出一个错误“Object required”。

首先,由于您是通过LoadLibrary调用它,所以这里没有类 – 只有函数被导出供公众使用。 所以你的mainClass引用将永远不会工作。 假设您有一个导出的函数getVersion

我会尝试以下内容:

 Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibmodulee 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 hmodulee 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 

你需要在这个DLL上调用COM方法吗? 如果是这样,我一点也不确定这是可能的。

  • 尽管马修·柯兰德(Matthew Curland)出色的高级Visual Basic 6是我所看到的第一个地方。 那里有一些强大的内部COM的东西,绕过了正常的VB6技术。

  • 还有DirectCom ,它允许您在不使用COM的情况下调用COM方法。 从来没有使用它,但人们在VB6新闻组上聊天。