我需要为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在显示消息框时将DLL加载到内存中,然后丢弃.但是,调用该方法自然是不够的 – 我需要访问动态加载的DLL中的方法.

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

抛出错误“需要对象”.

首先,由于您通过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

windows – 在Visual Basic 6中访问动态加载的DLL(使用LoadLibrary)的更多相关文章

  1. LoadLibrary project.dll失败.指定的模块无法找到

    当我尝试注册我的C/ATL项目的32位版本时我收到这个错误:project.dll是我在VisualStudio10上使用ATL构建的dll.64位版本注册正常.我错过了什么?

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

    ).我在VisualBasic6中执行此操作,并使用以下示例进行加载和卸载:我可以看到使用ProcessExplorer在显示消息框时将DLL加载到内存中,然后丢弃.但是,调用该方法自然是不够的–我需要访问动态加载的DLL中的方法.我怎样才能做到这一点?我想在类mainClass中调用方法getVersion,它在TestDLL中,如下所示:但是,行抛出错误“需要对象”.首先,由于您通过LoadLibrary调用它,因此这里没有类–只导出函数供公众使用.所以你的mainClass引用永远不会工作.假设您有

  3. 我的dll代码从一个exe文件中工作,但是无法从Java loadLibrary加载

    >当我在Unix中编译我的Java程序并加载我的库(.so)Java的loadLibrary,它工作正常。我不知道为什么在Windows中运行JavaloadLibrary时它不会起作用,但是在其他地方使用相同的代码可以工作。我需要其中的方法,但是我无法使用javaloadLibrary加载它。>myJavaProgram,只需调用System.loadLibrary()来加载基本的.dll在我的另一个dll中调用包含JNI代码的方法的文件。它使用的dll是sh33w32.dll,它被称为SmartHea

  4. c# – LoadLibrary,FreeLibrary和GetModuleHandle Win32功能线程安全吗?

    奥斯卡解决方法根据IgorTandetnik.除了不是线程安全的GDI函数.几乎任何需要HWND和/或HDC的东西必须在创建HWND或HDC的同一线程上被调用.HBITMAP,HICON等等可以在线程之间传递,但一次应该由一个线程操纵.大多数其他功能–那些不处理GDI或窗口管理的功能确实是线程安全的.这应该包括LoadLibrary,GetModuleHandle,FreeLibrary和GetProcAddress.请记住,不应该从DllMain调用FreeLibrary.我还可以补充说,我已经在多线程

  5. C LoadLibrary ERROR_NOACCESS“对内存位置的访问无效.”

    这就是答案.一个非常具体的案例,但我想如果有其他人发现他们得到了998个错误并且需要知道要检查哪些类型的问题,这是需要注意的事项:确保所有的全局变量都是独立的!

  6. c – 多次加载相同的dll

    我想加载相同的dll,例如Lib.dll多次!–>需要为每个LoadLibrary创建一个新进程!任何人都有一个例子或一些提示?!谢谢和问候解决方法听起来您希望DLL的每个实例都有单独的数据段.这是我能想到这个问题的唯一原因.实现此目的的唯一方法是确保每次调用LoadLibrary时,DLL具有不同的文件名.每次需要加载时,将DLL复制到临时文件,确保您使用的名称与DLL的任何加载实例不同.我赞同上面的评论,鼓励您重新设计系统架构.

  7. c – 尝试在缺少依赖DLL时使用LoadLibrary在Windows上加载DLL

    我有一个在Windows上使用LoadLibrary来动态加载插件的应用程序.但是一些插件还有其他依赖的DLL,如数据库客户机DLL.当您尝试加载这样一个DLL并且其中一个依赖的DLL不存在时,您会得到一个讨厌的Windows对话框:“程序无法启动,因为您的计算机上缺少xxx.ddl,请尝试重新安装程序来解决此问题.有没有什么简单的方法来避免这个对话?我希望有人可以使用LoadLibraryEx并

  8. c – LoadLibrary失败,错误代码为14001

    我正在使用VisualC2008ExpressEdition来创建仅限资源的DLL.我面临的问题是运行使用DLL的应用程序在我的另一台计算机上导致LoadLibrary()函数失败,错误代码为14001.通过互联网搜索它似乎是计算机的依赖性问题运行缺少MicrosoftVisualC2008RedistributablePackage库的应用程序.我的第一步是安装最新的MicrosoftVisua

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部