我想統計進程的數量,因爲每個進程都使用LoadLibary。 我正在考慮註冊程序作爲一個選項。在Delphi中使用DLL註冊
這個想法是當一個進程使用該庫時,庫可以創建一個單獨的進程 並且當最後一個進程註銷時,進程關閉,如果它的子進程關閉它。
有沒有人用* DLL做過這件事,他們是如何實現它的?請
我想統計進程的數量,因爲每個進程都使用LoadLibary。 我正在考慮註冊程序作爲一個選項。在Delphi中使用DLL註冊
這個想法是當一個進程使用該庫時,庫可以創建一個單獨的進程 並且當最後一個進程註銷時,進程關閉,如果它的子進程關閉它。
有沒有人用* DLL做過這件事,他們是如何實現它的?請
動態鏈接庫創建工作在內存和可執行過程中。
如果你是舒爾你需要獨立的進程閱讀:
http://msdn.microsoft.com/en-us/library/ms682583(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms682594(v=vs.85).aspx
http://delphi.about.com/cs/adptips2003/a/bltip1003_2.htm
重要:http://delphi.about.com/od/objectpascalide/l/aa103003a.htm
沒有混雜的'SysInit.DllProcEx',不確定它的RTL版本要求,tho。另外:有需要DllMain功能的庫的官方Borland樣板。 – 2011-06-10 03:13:40
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世界中,庫模型更加高效。
也許值得解釋的基地址和影響,不設置它可能有重新安置 – 2011-06-10 08:12:12
@大衛你是對的,但我想這個問題是比這更高的層次。我試圖解釋任何操作系統中的進程加載機制,因爲就編寫問題而言'LoadLibrary'機制似乎並不清楚。 'LoadLibrary'是你的朋友,而不是你的敵人。 :) – 2011-06-10 09:50:42
歡迎回到Stack Overflow。*您想要統計哪些流程?當前正在使用您的DLL的進程數量?我想知道爲什麼。 – 2011-06-10 01:30:53
請詳細解釋你的根本問題是什麼 – 2011-06-10 05:18:47
我仍然不知道你的問題是什麼。你想要統計哪些流程?你爲什麼要計算進程? – 2011-06-10 12:21:36