启动包含作为资源嵌入的dll的程序出现问题

4
我已经完成了关于在Delphi EXE中嵌入dll的About.com指南,看起来是有效的,只要我不使用该DLL作为外部函数。有没有办法让我链接的代码在uses子句引用的单元之前就能工作?
我尝试过:
  • 按照这段代码所说的做。
  • 将此代码放置在使用外部函数的单元的初始化部分。
  • 将此代码放置在使用外部函数的单元的初始化部分。

而我所说的外部函数是指像这样的函数:

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

我遇到的问题是 'fundll.dll' 无法加载(因为它不在目录中)。Zarko 的代码可以工作(非常好,它会在该文件夹中创建 dll),但当我使用所需的外部函数时,在项目启动之前就会崩溃。

如果你从中调用函数,那么它就不是一个“资源DLL”。它只是一个被嵌入为资源的DLL。一个资源DLL的唯一目的是保存资源。 - Rob Kennedy
我很好奇。你为什么想把一个DLL放在你的EXE里面?在我看来,这似乎违背了使用DLL的目的。 - Mason Wheeler
1
Mason可以让你拥有一个自包含的程序来分发,同时调用那些你没有源代码的函数,因此无法直接编译到你的EXE中。 - Rob Kennedy
3个回答

6

你不能使用外部函数来实现这个功能 - 在提取DLL后,使用LoadLibrary()GetProcAddress()代替即可,这样一切都应该正常工作。

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


4

3
如果您想在IT中调用函数,则有两种选择...
1)使用exe / dll打包程序而不是资源方法。 2)不要链接到具有外部样式声明的库。改为使用LoadLibrary,GetProcAddress等引用所需调用的函数。
资源方法和函数的外部声明将不会混合。 Windows希望在您的代码运行以提取dll之前将您的exe与dll链接到内存中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接