4

我在模块中有以下声明:

Private Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As String, ByVal mode As String) As Long

函数中的以下代码行失败,并出现“找不到文件:ZLIB.DLL”错误:

lGZFileHandle = gzopen(sPath, "rb")

我知道 ZLIB 不需要注册。我的问题是,ZLIB.DLL 需要放在哪里才能让我的代码工作?我也知道这段代码正在另一台机器上运行。目前我在与应用程序 exe 相同的文件夹中有 ZLIB.DLL。

更新

令我松了一口气的是,代码在编译时确实有效。但在 IDE 中运行时不起作用(它在另一台机器上运行)。我的应用程序文件夹中仍然有 ZLIB.DLL。这意味着必须检查应用程序路径以加载 DLL。

为了解决这个问题,我尝试过:

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

然后在函数中:

SetDllDirectory App.path

这似乎允许加载 DLL,但随后我得到一个“错误的 DLL 调用约定”错误。情节变厚了。

解决了

答案似乎在这里:http ://www.zlib.net/DLL_FAQ.txt 。我想这是RTFM的一个例子。因此,奇怪的是,在 IDE 中,STD_CALL约定是有效的,但是一旦编译了 C 风格的调用约定就足够了。它仍然没有解释为什么它可以在 IDE 中的不同机器上工作。哼哼。

感谢大家为我指明正确的方向。

4

4 回答 4

7

VB6 偏离了 Ken 建议的搜索协议(此链接是快速参考)。

通常的问题是 .exe 路径(列表中的搜索位置 #1)不是VB 程序的路径,而是 VB6 IDE。所以把DLL放在你的VB程序的位置是不好的——除非你改变VB6快捷方式的“开始”位置指向那个位置。

或者,您可以将 DLL 放在我的链接中指定的其他位置之一。

于 2009-09-24T19:29:46.400 回答
2

通过 Visual Studio IDE 运行时,所有相关文件都需要放在以下文件夹中:C:\Program Files\Microsoft Visual Studio\VB98\

这是因为调试时运行的 exe 驻留在该文件夹中。这将允许您在不更改任何路径的情况下进行调试。

于 2012-06-14T17:05:31.550 回答
0

你确定ZLIB不需要注册吗?

我建议你注册它,然后再试一次。

编辑
尝试将 DLL 放在您的系统文件夹中。我相信你的程序会在那里检查它。

于 2009-09-24T19:09:12.680 回答
0

ZLib 必须在标准 DLL 加载搜索路径中。有关查找 DLL 的方式和搜索顺序的详细信息,请参阅MSDN LoadLibrary文档。

于 2009-09-24T19:20:21.377 回答