将另一个DLL链接到项目后,C ++ DLL无法加载

时间:2011-04-19 16:15:07

标签: c++ dll avisynth

我正在使用Visual Studio 2010创建一个32位DLL作为第三方应用程序(AviSynth)的插件。第三方应用程序正确加载DLL,直到我尝试使用FFTW(http://fftw.org)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”

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

当我得到这样的东西时,我尝试的第一件事是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

答案 1 :(得分:0)

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

无论如何,它现在有效。谢谢你的帮助!