2

我正在使用 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”

谢谢你的帮助。

4

2 回答 2

2

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

http://www.dependencywalker.com/

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

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

ps:如果Dependency Walker没有发现任何问题,请尝试加载您的DLLLoadLibrary()并查看GetLastError()返回什么。


顺便提一句:

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

您不能LoadLibrary()从拨打电话DllMain()

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

入口点函数是你的DllMain

于 2011-04-19T16:25:58.453 回答
0

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

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

于 2011-04-19T19:03:39.220 回答