-2

テスト目的のためだけに DLL インジェクションを使用するプロジェクトを行っています。すべてうまくいったら、このテクニックを使うかもしれません。しかし、これまでのところ、DLL プロジェクトをコーディングするのは初めてだったためか、問題しかありませんでした。簡単に理解できるように、中断された explorer.exe プロセスを作成し、中断されたエクスプローラー内にこの DLL を挿入します。すべてが機能していましたが、DLL 内にタイマーを配置しようとすると、問題が発生しました。DLL コードを見てください。

uses
  SysUtils,
  Classes,
  Windows,
  ExtCtrls,
  Dialogs;

{$R *.res}
type
  TMyTimer = Class(TTimer)
  public
    procedure OnMyTimer(Sender: TObject);
  end;

var
  MyTimer: TMyTimer;

procedure EntryPoint(Reason: integer);
begin
  if Reason = DLL_PROCESS_ATTACH then
    begin
      MessageBox(0, 'DLL Injected', 'DLL Injected', 0);
      MyTimer := TMyTimer.Create(nil);
      MyTimer.Interval := 5000;
      MyTimer.OnTimer := MyTimer.OnMyTimer;
      MyTimer.Enabled:= true;
    end
  else
  if Reason = DLL_PROCESS_DETACH then
    begin
      MessageBox(0, 'DLL De-Injected', 'DLL De-Injected', 0);
    end;
end;

procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
  MessageBox(0, 'Timer Running', 'Timer Running', 0);
end;

begin
  DLLProc:= @EntryPoint;
  EntryPoint(DLL_PROCESS_ATTACH);
end.

さて、中断された explorer.exe プロセスに DLL を挿入すると、「DLL Injected」というメッセージが表示されます...この後、タイマーが作成され、5 秒ごとに「Timer Running」というメッセージが表示されます。 ..しかし、このメッセージが表示されず、すべてを試しましたが、何も機能しません... それは完全に混乱ですか、それとも何ですか?

4

2 に答える 2

4

TTimer はウィンドウ メッセージに依存するため、機能させるにはメッセージ ループが必要です。

于 2013-08-22T22:18:22.550 に答える