2011-02-09 84 views
0

首先,我知道全局變量是邪惡的:)但是,有合法的情況下爲什麼我需要使用它。全局變量在DLL中的使用限制(對於Windows)

我知道在DllMain(沒有LoadLibraries,沒有COM初始化等等)中可以執行什麼有非常嚴格的限制。

而且我知道全局變量是在DllMain DLL_PROCESS_ATTACH之前初始化的。

全局變量初始化時,我有同樣的限制嗎?

我發現微軟文章:http://msdn.microsoft.com/en-us/library/988ye33t 但是,它沒有任何有關限制的細節。

我也看到了另一個問題#1:What happens to global variables declared in a DLL? 這裏是有段「有跡象表明,被禁止在DllMain中做的事情那些東西都是可能禁止的,也是如此,在構造函數。」

但是,看起來評論者並不確定這些限制是否真的存在。

我希望在這個問題上的任何信息。

回答

6

正如我的this answer,真正的DLL入口點(即實DllMain)採取的是CRT,即,在DLL_PROCESS_ATTACH,初始化它的東西,調用全局的構造函數,然後調用「打假」 DllMain解釋(即你作爲一名程序員看到的是DllMain)。

MSDN文檔調用DllMainreal dll入口點,所以所有的限制也適用於全局對象的構造函數,因爲它們被它調用。

這是避免全局變量的另一個原因:它們的構造函數中的代碼是從DllMain調用的,但這並不明顯,所以如果在DllMain中執行「禁止」操作會導致問題,則可能需要很長時間在承認有問題的代碼是在這樣的構造函數之前。

+0

非常感謝:)這是非常明確的答案,它不會留下任何猜測空間。 – 2011-02-10 17:29:04