2011-06-10 120 views
1

我想統計進程的數量,因爲每個進程都使用LoadLibary。 我正在考慮註冊程序作爲一個選項。在Delphi中使用DLL註冊

這個想法是當一個進程使用該庫時,庫可以創建一個單獨的進程 並且當最後一個進程註銷時,進程關閉,如果它的子進程關閉它。

有沒有人用* DLL做過這件事,他們是如何實現它的?請

+3

歡迎回到Stack Overflow。*您想要統計哪些流程?當前正在使用您的DLL的進程數量?我想知道爲什麼。 – 2011-06-10 01:30:53

+0

請詳細解釋你的根本問題是什麼 – 2011-06-10 05:18:47

+0

我仍然不知道你的問題是什麼。你想要統計哪些流程?你爲什麼要計算進程? – 2011-06-10 12:21:36

回答

2
+0

沒有混雜的'SysInit.DllProcEx',不確定它的RTL版本要求,tho。另外:有需要DllMain功能的庫的官方Borland樣板。 – 2011-06-10 03:13:40

1

LoadLibrary() API調用已經共享在所有的圖書館使用它的過程。否則,任何調用了很多標準庫(kernel32.dll gdi32.dll ....)的Windows程序都將使用比需要更多的內存。

如果事實上,任何LoadLibrary() API調用都將訪問當前進程的.dll文件導出(即庫函數)。它只會在PS存儲器中「加載」一次(第一次使用它),然後它會將該庫鏈接到該過程,即它將從它們的名稱中設置所有需要的功能。

例如,如果您對我們的節目寫:

FHandle := LoadLibrary('library.dll') ; 
    FInitialize := GetProcAddress(FHandle, 'Initialize') ; 

庫不會從磁盤每次RAM中。只有第一次加載。

Windows只會搜索庫中名爲'Initialize'的導出函數,然後將其現有副本映射到當前進程地址空間,然後設置一個指針,以在需要時正確調用外部初始化函數。

所以我真的不明白你的問題的重要性:你不需要「計數」庫使用實例,因爲Windows已經在爲你做這件事,比你應該實現的更好。當沒有進程使用特定的庫時,它只是將其從內存中取消映射(好吧,我承認這不是發生的事情,它更復雜,但結果是一樣的)。

在Windows下進行鏈接是快速和高效的:例如.exe格式的鏈接速度更快,以便鏈接到用於Linux的elf格式,例如,

在所有情況下,由於庫需要鏈接到進程,因此您別無選擇,只能調用LoadLibrary,因爲這是庫在進程內存空間中唯一可用的方式。你可以想象使用管道或類似的遠程執行......但是在Windows世界中,庫模型更加高效。

+0

也許值得解釋的基地址和影響,不設置它可能有重新安置 – 2011-06-10 08:12:12

+0

@大衛你是對的,但我想這個問題是比這更高的層次。我試圖解釋任何操作系統中的進程加載機制,因爲就編寫問題而言'LoadLibrary'機制似乎並不清楚。 'LoadLibrary'是你的朋友,而不是你的敵人。 :) – 2011-06-10 09:50:42