即使进程关闭,也要保持DLL加载

时间:2013-08-21 15:48:37

标签: delphi dll

我正在开发一个将由我的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秒显示一条消息......这可能吗?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:-1)

你需要将一个DLL转移到另一个进程, 并挂钩你的代码来执行你的进程!

此方法称为Dll Injection和Code Hook, 使用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