4

我已经完成了关于在 Delphi EXE 中嵌入 dll 的 About.com 指南,这似乎可以工作,只要我实际上不使用 DLL 作为外部函数。有没有办法让我链接到的代码比使用子句中引用的单元更早地工作。
我试过了:

  • 完全按照这段代码所说的去做。
  • 将此代码放置在使用使用外部函数的单元的表单的初始化部分中。
  • 将此代码放在使用外部函数的单元的初始化部分。

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

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

我遇到的问题是无法加载通常的“fundll.dll”(因为它不在目录中)。当代码达到那一步时,Zarko 的代码就可以工作(非常棒,它在那个文件夹中创建了 dll)。但是当我使用我需要的外部功能时,它甚至在项目开始之前就崩溃了。

4

3 回答 3

6

您不能使用外部函数执行此操作 - 在提取 DLL 后使用LoadLibrary()GetProcAddress(),一切都应该正常工作。

原因是任何代码只有在操作系统加载器解析了所有入口点之后才会执行。有点鸡和蛋的问题,如果你愿意的话。

于 2009-04-29T16:19:39.837 回答
4

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

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

于 2009-05-02T00:53:04.813 回答
3

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

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

资源方法和函数作为外部的声明不会混在一起。windows希望在您的代码运行以提取dll之前将您的exe链接到内存中的dll。

于 2009-04-29T16:21:20.457 回答