我確定這個問題已被多次詢問,並且我已經閱讀了大量的文章,但我仍然不知道它是如何理解的。 DLL在哪裏加載?我正在談論DLL的實際代碼。當我打電話時,讓我們說,MessageBoxA,它跳到哪裏?代碼是否被加載到我自己的進程中,還是跳到別的地方(甚至不知道這是否可能)?究竟在哪裏得到加載DLL?
請賜教,這一直困擾着我很長一段時間,但我似乎無法弄清楚。
我確定這個問題已被多次詢問,並且我已經閱讀了大量的文章,但我仍然不知道它是如何理解的。 DLL在哪裏加載?我正在談論DLL的實際代碼。當我打電話時,讓我們說,MessageBoxA,它跳到哪裏?代碼是否被加載到我自己的進程中,還是跳到別的地方(甚至不知道這是否可能)?究竟在哪裏得到加載DLL?
請賜教,這一直困擾着我很長一段時間,但我似乎無法弄清楚。
每個進程加載一次DLL。這裏有一些更多的細節:
的DLL調用進程的內存空間,並具有相同的訪問權限
執行作爲this Stack Overflow answer描述:
每個進程最多加載一次DLL。因此,如果您的DLL被多個其他DLL使用,它仍然會在每個進程中存在一次。
該系統保持用於每個DLL每個進程的引用計數。當線程加載DLL時,引用計數會加1。當進程終止時,或者引用計數變爲零(僅運行時動態鏈接)時,DLL將從進程的虛擬地址空間中卸載。 與任何其他函數一樣,導出的DLL函數在調用它的線程上下文中運行。因此,下列條件適用:
- 調用DLL的進程的線程可以使用由DLL函數打開的句柄。同樣,由調用進程的任何線程打開的句柄都可以在DLL函數中使用。
- DLL使用調用線程的堆棧和調用進程的虛擬地址空間。
- DLL從調用進程的虛擬地址空間分配內存。
On Variable Scope:被聲明爲在DLL源代碼文件全球被視爲由編譯器和鏈接器全局變量
變量,但每加載一個給定的DLL進程都有自己的該DLL的全局變量的副本。靜態變量的範圍僅限於聲明靜態變量的塊。因此,默認情況下,每個進程都有自己的DLL全局和靜態變量實例。
在DLL加載之前,必須找到它們。有關Windows如何搜索DLL的具體規則,例如Dynamic-Link Library Search Order上列出的那些。