2011-02-09 41 views
0

まず、グローバル変数が悪いことを知っています:)しかし、私はなぜそれを使う必要があるのか​​正当な理由があります。DLLのグローバル変数の使用に関する制限(Windowsの場合)

私はDllMain(LoadLibrariesなし、COM初期化なしなど)で実行できるものに非常に厳しい制限があることを知っています。

グローバル変数がDllMain DLL_PROCESS_ATTACHの直前で初期化されていることがわかりました。

グローバル変数の初期化中に同じ制限がありますか?

私はMicrosoftの記事を見つけました:http://msdn.microsoft.com/en-us/library/988ye33t ただし、制限事項に関する詳細はありません。

私はまた、別のStackOverflowの質問を見た:What happens to global variables declared in a DLL?ここ はそこからの抜粋である「DllMain内で行うことを禁止されているものがありますそれらのものは、コンストラクタで、あまりにも、禁じられおそらくです。」

しかし、commentorのように、そのような制限が実際に存在するかどうかはわかりません。

この件に関する情報はありがとうございます。

答えて

6

としては、鉱山のthis answerに説明し、実際のDLLのエントリポイント(つまり、本当のDllMain)は、DLL_PROCESS_ATTACHに、そのようなものを初期化し、こと、CRTで撮影したグローバルのコンストラクタを呼び出し、「偽」DllMainを呼び出しています(つまり、あなたはプログラマとしてDllMainと表示されます)。

DllMainリアル dllエントリポイントを呼び出すため、すべての制限はグローバルオブジェクトのコンストラクタにも適用されます。

これは、グローバルを避けるもう一つの理由です。コンストラクタ内のコードはDllMainから呼び出されますが、これは明白ではありません。DllMainで禁止されている問題が発生すると、問題のコードがそのようなコンストラクタにあることを確認する前に

+0

ありがとうございます:)それは推測の余地を残さない完全に明確な答えです。 –

関連する問題