VB6 - 找不到DLL文件

6
我正在尝试使用以下命令在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放在项目的同一文件夹中。
有没有办法解决这个问题?
谢谢。

@JohnFx 我的问题是我无法从应用程序目录加载它,而不是我在 app 文件夹 dll 之前加载 system32 dll。 - Beppe
@JohnFX和其他人:这不是如何强制VB6使用应用程序目录中的DLL和OCX的重复。请撤销您的关闭投票。 - MarkJ
@MarkJ - 即使我同意你的观点,也无法撤销关闭投票。 - JohnFx
5个回答

8

我的心灵感应预测你正在逃离VB6 IDE - 因为构建的EXE将在应用程序目录(与exe相同的目录)中找到DLL。

  • 当您从VB6 IDE运行时,它将从应用程序目录中查找DLL ... 但它认为应用程序目录是包含VB6 IDE本身的目录 :(
  • 一个解决方法是在尝试使用DLL之前将当前工作目录更改为VBP目录。例如 Chdrive App.Path: Chdir App.Path (air code)
  • 编辑 根据Beppe的评论。您可以尝试的另一个解决方法是,在开发计算机上,将DLL的副本放在安装VB6 IDE的相同目录中。可能是C:\Program Files\Microsoft Visual Studio\VB98\ 您可以将DLL与构建的EXE一起放在用户机器/生产机器上。

1
这个解决方案涉及到一个运行时操作,而我无法承担,因为我需要通过.tlb文件以隐式方式加载dll。我已经看到其他用VB6编写的应用程序在.exe文件所在目录中运行DLL。因此,必须有一种解决方案(我希望)不涉及路径的运行时计算。 - Beppe
@Beppe 原因很简单,解决方法也很简单(https://dev59.com/hnVC5IYBdhLWcg3w4Vb6#154595)。 - GSerg

3

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

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

然后按照以下步骤设置Dll目录:
SetDllDirectory App.path

0

使用“Depends”解决了问题

DLL中存在一个未满足的依赖项,但显然它在第一个DLL入口点上返回了错误。

谢谢大家


你现在是否成功地隐式加载了DLL?TLS的东西是否起作用?我非常想知道这个技巧是否确实有效。 - David Heffernan
@beppe 我认为你没有使用隐式链接,因为缺少依赖项的错误会在启动时触发。你是否在依赖项查看器中检查过你的exe是否引用了dll? - David Heffernan
@David 我尝试移除依赖项,但它停止工作了,所以我认为它需要这个链接。我还使用Depends进行了检查,并且它确实需要这个依赖项。 - Beppe
@David 是的,抱歉我的回答不够清晰。我注意到 MSVCR80.dll 依赖项有“?”号,但我不知道这是否会成为问题。 - Beppe
@David 为了避免“TLS”崩溃的问题,我暂时更改了函数的原型,去掉了所有参数(在函数内手动初始化)。虽然在IDE中启动仍会崩溃,但从.EXE启动就可以正常工作!所以现在唯一剩下的问题是关于字符串->char*转换。 - Beppe
显示剩余2条评论

0

正如Beppe在他们的回答中所说,使用

Depends yourdll.dll

如果您在名称旁边看到带有问号的其他DLL,则表示它们丢失了。
通常情况下,这将是Microsoft C++ Debug dll之一,即MSVCR120D.DLL。


-1

您需要先注册您的DLL。

Shell "regsvr32.exe /s " & path

其中“path”是DLL的路径。如果该DLL位于相同的目录中,则可以设置:

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


2
考虑到它可以使用declare语句,如果它在系统目录中,则我怀疑这不是一个COM dll。 - JohnFx
@JohnFx 这是一个用C语言编写的DLL。我不知道它是否为COM。 - Beppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接