温馨提示  2024年 6月我们已经停止开发者板块文章内容更新,谢谢来访。存档数据
知识 2023-11-28 52 次阅读

如何封装Delphi DLL为exe,使用

在 Delphi 中,封装 DLL 函数为 EXE 程序是一个常常出现在大家视野里的技术,能够让你将复杂的代码逻辑封装在一个独立的文件中,并在需要时进行调用。下面是一篇关于如何使用 Delphi 进行 DLL 封装 EXE 的简短说明:
**标题:** 使用Delphi封装DLL为EXE的简单指南
**内容:**
在 Delphi 中,DLL 函数可以被封装为一个独立的 EXE 程序。这是一个有用的技术,因为它允许你在一个可执行文件中封装复杂的代码逻辑,并在需要时进行调用。以下是一般的步骤:
1. **创建 DLL**:首先,你需要创建一个 DLL 文件,其中包含你想要封装的函数。 2. **创建接口**:在 DLL 中定义一个接口,以便其他程序可以调用你的函数。这通常通过在 DLL 中声明函数来完成。 3. **创建 EXE**:创建一个新的 Delphi EXE 文件,并将 DLL 文件作为资源添加到项目中。 4. **调用 DLL 函数**:在 EXE 文件中,你可以使用 Delphi 的 `LoadLibrary` 和 `GetProcAddress` 函数来加载 DLL 并调用其中的函数。 5. **释放资源**:如果你完成对 DLL 的调用后,记得使用 `FreeLibrary` 释放 DLL 文件。
根据以上的步骤,你可以将 Delphi 的 DLL 函数封装为一个独立的 EXE 程序,最终简化代码的维护和管理。希望这个简单的指南对你有所帮助!

Delphi是一款功能强大的编程语言,其构造的可执行文件(EXE)和动态链接库(DLL)可以嵌套或封装在一起。封装DLL和EXE到一个单一的可执行项可以简化您的应用程序的部署。本文将为您详细介绍在Delphi中如何将DLL封装到EXE文件中,以及相关的原理和适用场景。

## 原理

Delphi中将DLL封装到EXE的原理是使用资源 (Resource) 功能。资源可以包含诸如位图、光标、图标等,这些资源需要在程序运行时加载。同样地,我们可将一个DLL放入已包含资源的EXE之中,然后在程序运行时动态加载和卸载这些资源。

## 步骤

### 1. 创建一个DLL项目

首先,我们需要创建一个DLL项目。如下所示:

1. 打开Delphi。

2. 开启一个新的项目 (File > New > Project > DLL)。

3. 添加一些函数和过程,以供在EXE项目中调用。

例如

```delphi

library TestDll;

uses

SysUtils,

Classes;

function Add(a, b: Integer): Integer; stdcall;

begin

Result := a + b;

end;

exports

Add;

begin

end.

```

保存您的DLL项目,然后把它编译。下一步,我们将创建一个EXE项目以便嵌入这个DLL。

### 2. 创建一个EXE项目

1. 创建一个新的VCL表单应用项目 (File > New > Project > VCL Forms Application)。

2. 添加一个按钮控件,最终在用户单击时执行DLL中的相关函数。

3. 在项目源码中添加以下代码,引用并调用加载和卸载封装在资源中的DLL。

例如

```delphi

unit MainForm;

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,

System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type

TMainForm = class(TForm)

btnAdd: TButton;

procedure btnAddClick(Sender: TObject);

private

procedure LoadDLLFromResource(aResName, aResType: String);

procedure FreeLoadedDLL;

function GetTempFolder: String;

public

end;

var

MainForm: TMainForm;

hDLL: THandle;

implementation

{$R *.dfm}

function Add(a, b: Integer): Integer; stdcall; external 'TestDll.dll';

procedure TMainForm.btnAddClick(Sender: TObject);

begin

LoadDLLFromResource('TestDll', 'DLL');

ShowMessage(IntToStr(Add(3, 4))); // Call Add function from TestDll.dll

FreeLoadedDLL;

end;

procedure TMainForm.LoadDLLFromResource(aResName, aResType: String);

var

rs: TResourceStream;

fs: TFileStream;

TargetPath: String;

begin

rs := TResourceStream.Create(HInstance, aResName, PChar(aResType));

try

TargetPath := GetTempFolder + aResName + '.dll';

fs := TFileStream.Create(TargetPath, fmCreate);

try

fs.CopyFrom(rs, rs.Size);

finally

fs.Free;

end;

finally

rs.Free;

end;

hDLL := LoadLibrary(PChar(TargetPath));

end;

procedure TMainForm.FreeLoadedDLL;

begin

if hDLL <> 0 then

begin

FreeLibrary(hDLL);

hDLL := 0;

end;

end;

function TMainForm.GetTempFolder: String;

var

TempPath: array[0..MAX,PATH - 1] of Char;

begin

GetTempPath(MAX,PATH, TempPath);

Result := StrPas(TempPath);

end;

end.

```

在上述代码中,我们实现了

1. 将DLL从资源中提取到用户计算机上的临时文件夹;

2. 动态加载DLL,并调用其中的“Add”函数;

3. 卸载DLL库。

### 3. 将DLL嵌入到EXE的资源中

1. 打开创建的EXE项目,选择 Project > Resources and Images。

2. 创建一个新资源,类型为 `DLL`,名为 `TestDll`。

3. 导入步骤1中编译好的DLL文件,点击OK以保存。

4. 在项目源码中,在`implementation`关键字之前的`{$R *.dfm}`下面,添加一行代码 `{$R 'TestDll.res'}`以便编译时链接TestDll资源。

### 4. 编译和测试

现在您可以编译和运行EXE项目。点击 Add 按钮将调用封装在EXE内部的DLL函数。

封装DLL到EXE是一个非常有用的技巧,可以简化应用程序的部署和维护。除此之外,将库融合在程序文件中还可为防止DLL劫持提供一定保障,最终提升程序安全性。