【问题标题】:Maintain DLL loaded even when process closed即使进程关闭也保持 DLL 加载
【发布时间】:2013-08-21 15:48:37
【问题描述】:

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

【问题讨论】:

  • 不是真正的重复,@Lloyd。这是一个XY问题。接受的答案解决的真正问题是如何避免 DLL 导致启动时间过长。将 DLL 保存在内存中只是如何实现这一目标的一个想法(无论如何,这甚至都行不通)。此外,this 的问题也不仅仅是将其保存在内存中,而是关于继续执行
  • 您是如何让计时器在 DLL 中工作的?因为 DLL 没有消息泵,而您的计时器依赖它...
  • @user1526124:如果您解释为什么 DllMessage 例程需要在 DLL 中,您可能会得到更同情的回应。
  • @Jerry 主持人抽队列

标签: delphi dll


【解决方案1】:

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

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

【讨论】:

  • @Jerry 完成什么?
  • 我遇到了无法替换 Indy DLL 的问题,因为尽管调用进程已经结束,但它们“正在被另一个进程使用”。
  • libeay32 和 ssleay32
  • @Jerry 例如,使用进程资源管理器找出哪个进程仍然加载了 DLL。请记住,多个进程可以加载 DLL。
  • @Jerry 另请阅读您引用的错误消息。 “正在被另一个进程使用。”
【解决方案2】:

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

这个方法叫做Dll Injection and 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

【讨论】:

  • 为什么注入比启动一个新进程更好?另外,u 和 ur 不是单词。
  • 创建新进程需要新的应用程序,你可以使用已经运行的,例如使用系统。或者它总是会在启动时创建一个新进程。因此,DLL 必须在第一次运行时加载到系统中。对不起谷歌的翻译!
  • 当那些已经运行的应用关闭时会发生什么?注射是您最后的手段。开始一个新流程非常简单且正常。
  • 对于一个不相关的固执己见的解决方案,我不得不说-1,以及你对!的表达
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2022-08-09
相关资源
最近更新 更多