2010-08-11 70 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