2011-06-09 41 views
2

我有一個程序(不是我的,沒有源代碼),它暴露了一個接口,所以我可以編寫一個將由我的程序調用的DLL。現在我想知道當我在這個DLL中聲明瞭一些變量時,它將在什麼內存空間中進行存儲?程序使用的DLL,其中聲明的變量存儲在哪裏?

我的意思是,它只是坐在EXE地址空間的內存空間中,對吧?儘管DLL是如何加載EXE的?我以爲只有一次DLL被加載到內存中,那麼在我的DLL中如何創建局部變量呢? (像對象,類等)

回答

3

一個DLL加載一次每個進程。曾經有一段時間DLL在進程之間共享,但自從Windows 3.1走向渡渡河之後,情況並非如此。

您在DLL中聲明的任何全局變量都將存儲在數據頁中。與EXE的全局變量不同的頁面,介意。

現在,如果您在堆上分配內存,您的分配是否與EXE混合取決於您使用的堆。如果EXE和DLL使用與DLL相同的運行時鏈接,那麼它們都會從同一堆獲得內存。如果他們有不同的運行時間,或靜態鏈接到運行時,他們會得到不同的堆。這變成了一個很大的蠕蟲罐,所以我不會在這裏進一步。

1

您的DLL將聲明一個DllMain,它等同於常規可執行文件中的入口點。當你的DLL被加載時,你的DLLMain被調用。 Here是鏈接到那裏應該做的最佳實踐。

通常你會在那裏進行某種初始化。當你的DLL被加載時,它被加載到名爲LoadLibrary的可執行文件的虛擬內存空間中。 LoadLibrary處理所有需要處理的映射和重定位。從這一點開始,您通過DLL分配或修改的所有內存都與其映射到的進程位於相同的虛擬內存空間中。

推測可執行接口通過加載您的DLL然後調用某種導出的函數。基本上,一旦你的DLL被加載,你所做的每件事都將在它加載到的進程的內存空間中。

如果你想知道更多關於你的DLL加載的時候到底發生了什麼,你應該看看LoadLibrary()的語義。