代码之家  ›  专栏  ›  技术社区  ›  Guillermo Phillips

VB6 API声明路径

  •  4
  • Guillermo Phillips  · 技术社区  · 15 年前

    我在一个模块中有以下声明:

    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 回复  |  直到 12 年前
        1
  •  7
  •   Marc Bernier    15 年前

    vb6偏离了ken建议的搜索协议(此 link 是快速参考)。

    通常的问题是.exe路径(列表中的搜索位置1)是 你的vb程序的路径,而不是vb6 ide。因此,将dll放在vb程序的位置是不好的——除非您更改vb6快捷方式的“起始”位置以指向该位置。

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

        2
  •  2
  •   Jamie    12 年前

    在Visual Studio IDE中运行时,所有相关文件都需要放在以下文件夹中: C:\程序文件\Microsoft Visual Studio\vb98\

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

        3
  •  0
  •   Ken White    15 年前

    zlib必须位于标准dll加载搜索路径中。见 MSDN LoadLibrary 有关如何找到DLL以及查找它们的顺序的详细信息的文档。

        4
  •  0
  •   Jay Riggs    15 年前

    你确定Zlib不需要注册吗?

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

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