【问题标题】:VB6 - DLL cannot be foundVB6 - 找不到 DLL
【发布时间】:2011-03-08 15:18:25
【问题描述】:

我正在尝试使用命令在 VB6 中加载 DLL

Private Declare Function myFuncLib "myDLL.dll" (ByVal file_name_in As String, _ ByVal file_name_out As String) As Long

但是一旦我运行程序,它就会弹出一个带有文本的框“:“运行时错误:53 找不到:myDLL.dll”

DLL 放置在项目的同一目录中。

如果我将 myDLL.dll 放在 system32 文件夹中它可以工作,但我不想这样做,我想将 dll 放在项目的同一文件夹中。

有没有办法解决这个问题?

谢谢

【问题讨论】:

标签: windows dll vb6


【解决方案1】:

我的超能力预测您正在从 VB6 IDE 运行 - 因为构建的 EXE在 app 目录(与 exe 相同的目录)中找到 DLL。

  • 当您从 VB6 IDE 运行时,它从 app 目录中查找 DLL...但它认为 app 目录是包含 VB6 IDE 本身的目录:(
  • 一种解决方法是在尝试使用 DLL 之前将当前工作目录更改为 VBP 目录。例如。 Chdrive App.Path: Chdir App.Path(航空代码)
  • 编辑 来自 Beppe 的评论。您可以尝试的另一种解决方法是,在您的开发机器上,将 DLL 的副本放在安装 VB6 IDE 的同一目录中。可能C:\Program Files\Microsoft Visual Studio\VB98\你可以把你构建的EXE的DLL放在用户机器/生产机器上。

【讨论】:

  • 此解决方案涉及我无法承受的运行时操作,因为我需要通过 .tlb 文件以隐式方式加载 dll。我已经看到用 VB6 编写的其他应用程序与 .exe 的同一目录中的 DLL 一起运行。所以必须有一个解决方案(我希望)不涉及路径的运行时计算。
  • @Beppe 原因很简单,workaround也是如此。
【解决方案2】:

声明对 Kernel32.lib SetDllDirectory 函数的引用:

Private Declare Function SetDllDirectory Lib "Kernel32" Alias     "SetDllDirectoryA" (ByVal path As String) As Long

然后设置dll目录如下:

SetDllDirectory App.path

【讨论】:

    【解决方案3】:

    使用“依赖”解决

    DLL 中有一个不满足的依赖关系,但显然它在第一个 DLL 入口点返回错误。

    谢谢大家

    【讨论】:

    • 您现在是否正在隐式加载 DLL? TLS 的东西有用吗?我很想知道这个技巧是否真的有效。
    • @David 我成功地引用了 .tlb 文件,但使用 Declare Function 它仍然崩溃,所以我猜这个技巧在这个意义上不起作用。我试图让它只使用在.tlb中声明的函数,但是atm我仍然有Strings-BSTR-char-whatever的问题(我想是有问题,或者更好,我希望)
    • @beppe 我不认为你确实得到了隐式链接,因为缺少依赖项的错误会在启动时触发。您是否检查了您的 exe 引用了 dll 的依赖项walker?
    • @David 我试图删除依赖项并且它停止工作,所以我认为它使用了链接。我还检查了 Depends 并获得了依赖项。
    • @beppe 我再问一次。 DLL 在 EXE 的导入表中吗?
    【解决方案4】:

    正如 Beppe 在their answer 中所说,使用

    Depends yourdll.dll
    

    如果您使用 ?在他们的名字旁边,这意味着他们失踪了。
    通常它将是 Microsoft C++ Debug dll 之一,即 MSVCR120D.DLL

    【讨论】:

      【解决方案5】:

      你需要先注册你的 DLL..

      Shell "regsvr32.exe /s" & 路径

      其中“path”是DLL的路径。如果DLL放在同一个目录下,那么可以设置:

      path = App.path & "/myDLL.dll"

      【讨论】:

      • 鉴于如果他在系统目录中有声明语句,它可以与声明语句一起使用,我怀疑这是一个 COM dll。
      • @JohnFx 是用C写的DLL,不知道是不是COM。
      猜你喜欢
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2011-12-19
      • 2012-07-25
      • 2018-10-14
      相关资源
      最近更新 更多