C ++ DLL не загружается после привязки другой DLL к проекту - PullRequest
2 голосов
/ 19 апреля 2011

Я использую Visual Studio 2010 для создания 32-разрядной библиотеки DLL в качестве подключаемого модуля для стороннего приложения (AviSynth).DLL корректно загружалась сторонним приложением, пока я не попытался использовать FFTW (http://fftw.org) DLL. Я взял 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 ]

2 голосов
/ 19 апреля 2011

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

http://www.dependencywalker.com/

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

IMO один из необходимых инструментов для любого разработчика Windows.

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


КСТАТИ:

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

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

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

(Функция точки входа - это ваша DllMain)

0 голосов
/ 19 апреля 2011

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

В любом случае, он работает сейчас.Спасибо за помощь!

...