線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:919
推到 Plurk!
推到 Facebook!

DLL的問題

尚未結案
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-09 11:37:00 IP:61.219.xxx.xxx 未訂閱
我是使用動態連結的方法載入dll,請問是不是執行FreeLibrary, 所有在dll裡面動態配置的記憶體、建立的form…等等也都會從記憶體裡面釋放掉嗎? 發表人 - liangnet 於 2004/09/09 11:38:30
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-12 11:17:59 IP:211.162.xxx.xxx 未訂閱
Hi,liangnet,您好! 小弟的一點愚見:一個DLL基本上類似於一個EXE文件(PE)。包含了代碼或資源,能夠被其他的應用程式調用。最主要的區別是,DLL不是可以獨立執行的文件。    DLL通過動態鏈結技術(dynamic linking)與其他應用程式共用代碼。當一個應用程式使用了一個DLL,Win32系統會確保記憶體中只有一個該DLL的拷貝,這是通過記憶體映射文件來實現的。DLL首先被調入Win32的全局堆,然後映射到調用這個DLL進程的空間。在Win32系統中,每個進程都被分配有自己的32位線行位址空間。當一個DLL被多個進程調用時,每個進程都會得到該DLL的一份映射。在Win32中,DLL是可以被看作是屬於調用該DLL進程自己的代碼。但這並不意味著,如果多進程調用一個DLL,實體記憶體就分配該DLL的每個實例。通過從系統的全局堆到調用該DLL的每一個進程的位址空間的映射,DLL映射於每個進程的位址空間。    綜上所述:小弟認為,FreeLibrary在理想情況下會釋放掉自己佔有的資源 ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
Albertz
初階會員


發表:2
回覆:57
積分:31
註冊:2002-09-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-13 10:25:27 IP:211.20.xxx.xxx 未訂閱
引言: DLL通過動態鏈結技術(dynamic linking)與其他應用程式共用代碼。當一個應用程式使用了一個DLL,Win32系統會確保記憶體中只有一個該DLL的拷貝,這是通過記憶體映射文件來實現的。DLL首先被調入Win32的全局堆,然後映射到調用這個DLL進程的空間。在Win32系統中,每個進程都被分配有自己的32位線行位址空間。當一個DLL被多個進程調用時,每個進程都會得到該DLL的一份映射。在Win32中,DLL是可以被看作是屬於調用該DLL進程自己的代碼。但這並不意味著,如果多進程調用一個DLL,實體記憶體就分配該DLL的每個實例。通過從系統的全局堆到調用該DLL的每一個進程的位址空間的映射,DLL映射於每個進程的位址空間。
DLL是 code segment 是共用, data/stack segment 是使用 application 的行程空間 (process space). 舉個比較淺顯的例子來說, 你可以在 DLL 中要求一塊記憶體, 運算完後將 pointer 傳給 application 做處理. 這是因為 DLL 與 application 使用同一行程空間, 才有能力作資料交換. FreeLibrary 只有把 DLL 的 code 從該行程中"抽走", 但卻無法處理 data segment 裡面所留下的垃圾.
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-13 10:51:25 IP:211.162.xxx.xxx 未訂閱
引言:
引言: DLL通過動態鏈結技術(dynamic linking)與其他應用程式共用代碼。當一個應用程式使用了一個DLL,Win32系統會確保記憶體中只有一個該DLL的拷貝,這是通過記憶體映射文件來實現的。DLL首先被調入Win32的全局堆,然後映射到調用這個DLL進程的空間。在Win32系統中,每個進程都被分配有自己的32位線行位址空間。當一個DLL被多個進程調用時,每個進程都會得到該DLL的一份映射。在Win32中,DLL是可以被看作是屬於調用該DLL進程自己的代碼。但這並不意味著,如果多進程調用一個DLL,實體記憶體就分配該DLL的每個實例。通過從系統的全局堆到調用該DLL的每一個進程的位址空間的映射,DLL映射於每個進程的位址空間。
DLL是 code segment 是共用, data/stack segment 是使用 application 的行程空間 (process space). 舉個比較淺顯的例子來說, 你可以在 DLL 中要求一塊記憶體, 運算完後將 pointer 傳給 application 做處理. 這是因為 DLL 與 application 使用同一行程空間, 才有能力作資料交換. FreeLibrary 只有把 DLL 的 code 從該行程中"抽走", 但卻無法處理 data segment 裡面所留下的垃圾.
謝謝,真理越辨越明,小弟受益良多。哈哈,又偷學到一招,賺到了 ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
系統時間:2024-05-19 6:56:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!