代码之家  ›  专栏  ›  技术社区  ›  simon

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

  •  3
  • simon  · 技术社区  · 16 年前

    我需要为DLL创建一个包装器,根据需要加载和卸载它(对于那些对这个问题的背景感兴趣的人,请参阅 How to work around memory-leaking 3rd party DLL (no source code) accessed by Tomcat application? ) . 我在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

    我怎样才能做到这一点?我想在类mainClass中调用方法getVersion,它位于TestDLL中,如下所示:

    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
    

    抛出错误“需要对象”。

    2 回复  |  直到 9 年前
        1
  •  4
  •   AngryHacker    16 年前

    首先,因为您是通过LoadLibrary调用它的,所以这里没有类——只有函数被导出供公众使用。所以你的mainClass参考永远不会起作用。假设你有一个函数 获取版本 这是出口的。

    我会尝试以下方法:

    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
    
        2
  •  2
  •   Cœur Gustavo Armenta    7 年前

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

    • 马修·科兰德很棒 Advanced Visual Basic 6 不过,这是我首先要看的地方。有一些强大的引擎盖下COM的东西在那里,绕过正常的VB6技术。

    • 还有 DirectCom