【问题标题】:Problem starting program with a dll embedded as a resource使用作为资源嵌入的 dll 启动程序时出现问题
【发布时间】:2010-10-22 15:10:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果您从它调用函数,那么它不是“资源 DLL”。它是一个恰好作为资源嵌入的 DLL。资源 DLL 的唯一目的是保存资源。
  • 我很好奇。为什么要在 EXE 中放入 DLL?在我看来,这违背了使用 DLL 的目的。
  • Mason,它让你有一个独立的程序来分发,但调用你没有源代码的函数,因此不能直接编译到你的 EXE 中。

标签: delphi dll embedded-resource


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 2012-03-29
        • 2012-11-25
        • 2011-07-05
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        相关资源
        最近更新 更多