2013-08-21 27 views
-4

我正在開發一個將由我的EXE加載的DLL文件...因此,EXE將調用第一個DLL過程,並且在此過程得到加載時,我想保持其打開狀態,即使EXE會關閉。例如,我有一個帶有定時器的DLL,顯示'Hello World'消息。 DLL代碼:即使在進程關閉的情況下仍然維持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秒的消息......這可能嗎?

+0

不是一個真正的重複,@Lloyd。這是一個XY問題。被接受的答案提到的真正問題是如何避免DLL導致啓動時間過長。將DLL保存在內存中只是一個想法,即如何實現這一點(無論如何,這甚至不起作用)。此外,*這個問題不僅僅是將它保存在內存中,而是關於繼續*執行*。 –

+0

你是如何使定時器在DLL內工作的?由於DLL沒有消息泵,因此您的計時器依賴於... –

+0

@ user1526124:如果解釋爲什麼DllMessage例程需要位於DLL中,您可能會得到更多的同情迴應。 – MartynA

回答

5

將DLL加載到進程中,並且在沒有進程託管它們的情況下不能存在。所以你問的是不可能的。

如果要關閉進程但繼續執行代碼,則需要啓動一個新的獨立進程來執行該代碼。

+0

我想知道Indy DLL如何設法完成這個... –

+0

@Jerry完成什麼? –

+0

我遇到過無法替換Indy DLL的問題,因爲它們「正在被另一個進程使用」,儘管調用進程已經結束。 –

-1

你需要將一個DLL附加到另一個進程中, 和hook ur代碼在你的進程上執行!使用madcodehook部件

調用此方法DLL注入和代碼鉤, 簡便的方法


http://www.madshi.net/

例如注射
http://help.madshi.net/DllInjecting.htm

示例代碼鉤住
http://help.madshi.net/ApiCodeHooking.htm

種或 creanting UR方式
http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces

+1

爲什麼注射比開始一個新的過程更好?另外,你和你不是話語。 –

+0

創建新進程需要新的應用程序,可以使用那些已經在運行的系統,例如。 或者它始終會在開始時創建一個新流程。 因此,DLL必須從第一次運行加載到系統中。 對不起,谷歌翻譯! –

+0

當那些已經運行的應用程序關閉時會發生什麼?注射是你作爲最後的手段。開始一個新的過程非常簡單和正常。 –

相關問題