使用嵌入的dll作为资源启动程序时出现问题

时间:2009-04-29 16:09:09

标签: delphi dll embedded-resource

我已经完成About.com guide to embedding dll's in Delphi EXE's这似乎有效,只要我实际上不使用DLL作为外部函数。无论如何,让我链接的代码比使用子句中引用的单元更早地工作 我试过了:

  • 完全按照此代码的说法进行操作。
  • 将此代码放在使用使用外部函数的单元的表单的初始化部分。
  • 将此代码放在使用外部函数的设备的初始化部分。

通过外部函数,我指的是一个看起来像的函数:

function MyFunction: Integer; stdcall; external 'fundll.dll';

我得到的问题是通常的'fundll.dll'无法加载(因为它不在目录中)。当代码到达那么远时,Zarko的代码工作(相当甜,它在该文件夹中创建了dll)。但是当我使用我需要的外部功能时,它只是在项目开始滚动之前崩溃。

3 个答案:

答案 0 :(得分:6)

你无法使用外部函数执行此操作 - 在提取DLL后使用 LoadLibrary() GetProcAddress(),一切都应该有效。

原因是只有在OS加载程序解析了所有入口点后才会执行任何代码。如果你愿意,那就是鸡和蛋的问题。

答案 1 :(得分:4)

如果您要使用LoadLibrary()和GetProcAddress(),您可能更喜欢使用BTMemoryModule,它允许您使用嵌入的DLL作为资源而不将其保存到文件系统(用户可能无法使用)要做,取决于机器的安全性。)

http://www.jasontpenny.com/blog/2009/05/01/using-dlls-stored-as-resources-in-delphi-programs/

答案 2 :(得分:3)

如果你想在其中调用一个函数,你有两个选择......

1)使用exe / dll捆绑器而不是资源方法。 2)不要使用外部样式声明链接到库。而是使用LoadLibrary,GetProcAddress等来引用您需要调用的函数。

资源方法和函数声明为外部不会混用。 Windows希望在代码运行之前将你的exe链接到内存中的dll 来提取dll。