C++ DLL не загружается после привязки другой DLL к проекту

Я использую Visual Studio 2010 для создания 32-разрядной библиотеки DLL в качестве плагина для стороннего приложения (AviSynth). DLL корректно загружалась сторонним приложением, пока я не попытался использовать библиотеку FFTW (http://fftw.org). Я взял 32-битную FFTW DLL, запустил "lib /def:libfftw3-3.def", чтобы создать файл.lib, и добавил, что это ресурс в проекте. Сделал несколько звонков на функции. Он компилируется нормально, но когда я пытаюсь загрузить его в сторонний инструмент, он не работает.

Я пытался поместить FFTW DLL вместе с моей DLL, и я также пытался использовать LoadLibrary изнутри моего DllMain, но он все еще не работает.

Я могу остановить отладчик в функции DllMain и в функции, вызываемой AviSynth (AvisynthPluginInit2), но AviSynth утверждает, что не может загрузить DLL после этого, и точки останова на вершинах функций, которые были вызваны ранее, больше не попадают,

Сообщение об ошибке AviSynth: LoadPlugin: невозможно загрузить "C:\Program Files (x86)\AviSynth 2.5\plugins\xxxMYPLUGINxxx.dll"

Спасибо за вашу помощь.

2 ответа

Первое, что я пытаюсь получить, когда получаю что-то вроде этого, это Dependency Walker:

http://www.dependencywalker.com/

Он не уловит все возможные проблемы, но он очень быстро проверяет наличие простых проблем (отсутствующие библиотеки DLL, отсутствующие экспорты). Вы также можете настроить его на открытие любого количества расширений файлов, дважды щелкнув по ним. Я обычно устанавливаю.dll,.ax, .ocx, .sys,.exe.

ИМО один из важнейших инструментов для любого разработчика Windows.

PS: если Dependency Walker не находит проблем, попробуйте загрузить вашу DLL с LoadLibrary() и посмотрим что GetLastError() возвращается.


КСТАТИ:

и я также пытался использовать LoadLibrary из моего DllMain, но он все еще не работает.

Вы не можете позвонить LoadLibrary() от DllMain(),

Функция точки входа должна выполнять только простые задачи инициализации или завершения. Он не должен вызывать функцию LoadLibrary или LoadLibraryEx (или функцию, которая вызывает эти функции), поскольку это может создавать циклы зависимостей в порядке загрузки DLL.

(Функция точки входа является вашим DllMain)

Оказывается, что FFTW DLL должна была находиться в том же каталоге, что и скрипт AVS, а не в каталоге плагинов AVISynth. Я думаю, что это рабочий каталог для Virtual Dub.

Во всяком случае, это работает сейчас. Спасибо за помощь!

Другие вопросы по тегам