-4

我正在开发一个将由我的 EXE 加载的 DLL 文件......所以 EXE 将调用第一个 DLL 程序,当这个程序被加载时,我想保持它打开,即使 EXE 被关闭。例如,我有一个带有计时器的 DLL,显示一条“Hello World”消息。DLL 代码:

uses
  SysUtils,
  Classes,
  Dialogs,
  ExtCtrls;

{$R *.res}

type
  TMyTimer = Class(TTimer)
  public
    procedure OnMyTimer(Sender: TObject);
  end;

procedure DllMessage; export;
var
  MyTimer: TMyTimer;
begin
  MyTimer := TMyTimer.Create(nil);
  MyTimer.Interval := 10000;
  MyTimer.OnTimer := MyTimer.OnMyTimer;
end;


procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
  ShowMessage('Hello World');
end;

exports DllMessage;

begin
end.

EXE 是这样加载的:

procedure DllMessage; external 'Message.dll'

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  DllMessage;
end;

当我关闭 EXE 时,我希望 DLL 继续运行并每 10 秒显示一次消息……这可能吗?

4

2 回答 2

5

DLL 被加载到进程中,如果没有进程来承载它们,它们就无法存在。所以你问的是不可能的。

如果要关闭进程,但继续执行代码,则需要启动一个新的独立进程来执行该代码。

于 2013-08-21T15:56:01.380 回答
-1

您需要将 A DLL 附加到另一个进程,并挂钩您的代码以在您的进程上执行!

这种方法称为 Dll 注入和代码挂钩,使用 madcodehook 组件的简单方法


http://www.madshi.net/

示例注入
http://help.madshi.net/DllInjecting.htm

示例代码挂钩
http://help.madshi.net/ApiCodeHooking.htm

或创造你的方式
http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces

于 2013-08-21T16:35:52.417 回答