2010-08-11 71 views
0

我的應用程序使用Bass.dll,並將其添加到資源中。我希望在應用程序啓動之前將其解壓縮。如何使其無效?如何從資源中提取dll

+0

爲什麼嵌入bass.dll? – 2010-08-11 07:29:07

+0

@Jeroen Pluimers,我不想安裝等。這個想法是讓它瞬間,沒有安裝需要測試音頻。 – XBasic3000 2010-08-12 00:53:07

+0

所以你基本上希望你的應用程序是自己的設置。安裝程序非常複雜的原因很多(例如:即使您是管理員,也無法在特定位置進行書寫)。爲陡峭的學習曲線做好準備...... – 2010-08-12 06:08:40

回答

5

XBasic3000,我覺得你的問題是至極也許你正在使用外部聲明這樣

function Foo: integer; stdcall; external 'bass.dll'; 

所以操作系統不能解決DLL中的函數的地址。

相反,您必須在提取DLL後使用LoadLibrary()GetProcAddress()函數,這樣可以通過檢查DLL的存在來避免崩潰。

+2

如果使用D2010中引入的新'延遲'功能,它會爲您處理LoadLibrary()和GetProcAddress()。 – 2010-08-11 05:57:41

+0

我試過了,但一些函數不能獨立工作Bass_Init。當前路徑上的 – XBasic3000 2010-08-12 00:55:41

3

如果提取DLL,你把它放在哪裏?您的應用程序不是安裝應用程序(setup.exe),它具有特殊的專用權限,因此無法在Vista/Windows7下寫入\ windows \ system32甚至\ program files \ yourapp。嘗試將其放入程序目錄將導致它位於其他位置,通過VirtualStore。所以你必須在嘗試LoadLibrary()之前驗證FileExists('bass.dll')。

+0

。我不想安裝等。這個想法是讓它瞬間,沒有安裝需要測試音頻。 – XBasic3000 2010-08-12 00:54:22

+0

如果「當前路徑」位於Vista或Windows7上的\ program files(或64位系統上的x86路徑)中的任何位置,該文​​件實際上不會在那裏。 – 2010-08-12 02:40:32

5

我認爲你的問題的解決方案由RPUZChris Thornton(均爲最新投票)來描述。如果將文件解壓縮到硬盤會導致麻煩,則應該知道可以直接從內存加載DLL。

Zarko Gajic在delphi.about.com解釋。

+0

+1,因爲這實際上是他想要完成的。 – 2010-08-12 15:40:54