我在模块中有以下声明:
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中的其他计算机。哼哼。
感谢所有人指出我正确的方向。
答案 0 :(得分:7)
VB6偏离了Ken建议的搜索协议(这个link是快速参考)。
通常的问题是.exe路径(列表中的搜索位置#1)不是 VB程序的路径,而是VB6 IDE。因此,将DLL放在VB程序的位置并不好 - 除非您将VB6快捷方式的“Start In”位置更改为指向该位置。
或者,您可以将DLL放在我链接中指定的其他位置之一。
答案 1 :(得分:2)
在Visual Studio IDE中运行时,所有相关文件都需要放在以下文件夹中: C:\ Program Files \ Microsoft Visual Studio \ VB98 \
这是因为调试时运行的exe驻留在该文件夹中。这将允许您在不更改任何路径的情况下进行调试。
答案 2 :(得分:0)
您确定ZLIB无需注册吗?
我建议您注册并重试。
修改强>
尝试将DLL放入System文件夹中。我相信你的程序会在那里检查它。
答案 3 :(得分:0)
ZLib必须位于标准的DLL加载搜索路径中。有关DLL的查找方式和搜索顺序的详细信息,请参阅MSDN LoadLibrary文档。