我在一个模块中有以下声明:
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需要放在哪里?我也知道这段代码在另一台机器上是可以运行的。目前,我将ZLIB.DLL放在应用程序exe文件所在的同一个文件夹中。
更新:
让我松了一口气的是,编译后的代码确实可以工作。但是在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中运行正常。唉。感谢大家指引我走向正确的方向。
Declare
改为使用ZLIBI.DLL,在IDE中当它无法在VBP目录中找到DLL时,你又将其改回来以尝试解决问题? - MarkJcdecl
调用中,堆栈会被破坏,但 VB6 会尝试修复损坏的堆栈,并且似乎可以正常工作。显然,IDE 中的 p-code 并没有那么幸运,无法修复堆栈。您可以使用cdecl
调用的 thunk 来使其正常工作,而不会破坏堆栈(http://planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=49776&lngWId=1)。 - wqw