2011-04-19 88 views
2

我正在使用Visual Studio 2010創建一個32位DLL作爲第三方應用程序(AviSynth)的插件。直到我嘗試使用FFTW(http://fftw.org)DLL時,該DLL才被第三方應用程序正確加載。我使用了32位FFTW DLL,運行「lib /def:libfftw3-3.def」來創建一個.lib文件,並將其添加爲項目中的資源。對這些功能進行了一些調用。它編譯得很好,但是當我嘗試在第三方工具中加載它時,它失敗了。將另一個DLL鏈接到項目後,C++ DLL無法加載

我試過把FFTW DLL放在我的DLL旁邊,我也嘗試從我的DllMain中使用LoadLibrary,但它仍然不工作。

我能夠在DllMain函數和AviSynth(AvisynthPluginInit2)調用的函數中停止調試器,但是AviSynth聲稱無法在此之後加載DLL,並且在之前調用的函數頂部出現斷點不再被擊中。

AviSynth常見錯誤消息是: LoadPlugin:無法加載 「C:\ Program Files文件(x86)的\ AviSynth的2.5 \插件\ xxxMYPLUGINxxx.dll」

感謝您的幫助。

回答

2

我嘗試當我得到這樣的事情是Dependency Walker中的第一件事情:

http://www.dependencywalker.com/

它不會抓住每一個可能出現的問題,但它是非常快速的檢查簡單的問題(缺少DLL文件,缺少出口)。您也可以將其設置爲通過雙擊打開任意數量的文件擴展名。我通常設置.dll,.ax,.ocx,.sys,.exe。

IMO之一任何Windows開發人員的必備工具。

PS:如果Dependency Walker中沒有發現任何問題,嘗試加載 DLL與LoadLibrary(),看看GetLastError()回報。


BTW:

,我已經使用的LoadLibrary從我的DllMain裏面也試過,但它仍然沒有工作。

您不能從DllMain()撥打電話LoadLibrary()

入口點函數應該只執行簡單的初始化或終止任務。它不能調用LoadLibrary或LoadLibraryEx函數(或調用這些函數的函數),因爲這可能會在DLL加載順序中創建依賴關係循環。

(該入口點函數是你DllMain

+0

好的。我已經從DllMain()中移除了對LoadLibrary()的調用。現在我寫了一個非常簡單的控制檯應用程序,它只是在我的DLL和FFTW DLL上調用LoadLibrary。在這兩種情況下,我得到的HResult都是「0x8007007e - 找不到指定的模塊」。 – xlat808 2011-04-19 16:55:57

+0

檢查Dependency Walker,可能是缺少導入。 – 2011-04-19 17:25:27

0

原來,FFTW DLL必須是在同一目錄中AVS腳本,而不是AviSynth的插件目錄。我想這就是虛擬配音的工作目錄。

無論如何,它現在有效。謝謝您的幫助!