【问题标题】:C++ DLL fails to load after linking another DLL to project将另一个 DLL 链接到项目后,C++ DLL 无法加载
【发布时间】:2011-04-19 16:15:06
【问题描述】:

我正在使用 Visual Studio 2010 创建一个 32 位 DLL 作为第 3 方应用程序 (AviSynth) 的插件。在我尝试使用 FFTW (http://fftw.org) DLL 之前,第 3 方应用程序正在正确加载 DLL。我使用了 32 位 FFTW DLL,运行“lib /def:libfftw3-3.def”来创建一个 .lib 文件,并将其添加为项目中的资源。对函数进行了一些调用。它编译得很好,但是当我尝试在第三方工具中加载它时,它会失败。

我尝试将 FFTW DLL 与我的 DLL 放在一起,并且我也尝试在我的 DllMain 中使用 LoadLibrary,但它仍然无法正常工作。

我能够在 DllMain 函数和 AviSynth (AvisynthPluginInit2) 调用的函数中停止调试器,但 AviSynth 声称此后无法加载 DLL,并且之前调用的函数顶部的断点是不再打了。

AviSynth 错误消息是: LoadPlugin:无法加载“C:\Program Files (x86)\AviSynth 2.5\plugins\xxxMYPLUGINxxx.dll”

感谢您的帮助。

【问题讨论】:

    标签: c++ dll avisynth


    【解决方案1】:

    当我得到这样的东西时,我首先尝试的是 Dependency Walker:

    http://www.dependencywalker.com/

    它不会发现所有可能的问题,但它可以非常快速地检查简单问题(缺少 DLL、缺少导出)。您还可以将其设置为通过双击打开任意数量的文件扩展名。我通常设置.dll、.ax、.ocx、.sys、.exe。

    IMO 是任何 Windows 开发人员的必备工具之一。

    ps:如果 Dependency Walker 没有发现任何问题,请尝试使用LoadLibrary() 加载您的 DLL,然后查看GetLastError() 返回的内容。


    顺便说一句:

    我也尝试在我的 DllMain 中使用 LoadLibrary,但它仍然无法正常工作。

    您不能从DllMain() 呼叫LoadLibrary()

    入口点函数应该只执行简单的初始化或终止任务。它不能调用 LoadLibrary 或 LoadLibraryEx 函数(或调用这些函数的函数),因为这可能会在 DLL 加载顺序中创建依赖循环。

    入口函数是你的DllMain

    【讨论】:

    • 好的。我已经从 DllMain() 中删除了对 LoadLibrary() 的调用。现在我编写了一个非常简单的控制台应用程序,它只在我的 DLL 和 FFTW DLL 上调用 LoadLibrary。在这两种情况下,我得到的 HResult 都是“0x8007007e - 找不到指定的模块”。
    • 检查 Dependency Walker,可能缺少导入。
    【解决方案2】:

    事实证明,FFTW DLL 必须与 AVS 脚本位于同一目录中,而不是 AVISynth 插件目录。我猜那是 Virtual Dub 的工作目录。

    无论如何,它现在可以工作了。感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多