3

DLL 内の次のコードはどうなりますか?

#include <vector>
std::vector<int> global_vector;

BOOL WINAPI DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        global_vector.push_back(1);
    }

    return TRUE;
}

... /MD でコンパイルした場合 ? ベクトルのコンストラクターと push_back (つまり、メモリ管理、例外処理など) によって呼び出されるコードは、MSVCRT.DLL にあります。私の知る限り、この段階でマップされることは保証されていません。特別扱いされますか?

4

1 に答える 1

1

ここから:

一言で言えば、DllMainが呼び出されたとき、OS ローダーはかなり壊れやすい状態にあります。まず、その構造にロックを適用して、その呼び出し内での内部破損を防ぎます。次に、依存関係の一部が完全にロードされた状態にない可能性があります。バイナリがロードされる前に、OS ローダーはその静的な依存関係を調べます。それらに追加の依存関係が必要な場合は、それらも調べます。この分析の結果として、DllMainこれらのバイナリを呼び出す必要があるシーケンスが導き出されます。それは非常に賢明であり、ほとんどの場合、MSDN で説明されているほとんどの規則に従わなくても問題を解決できますが、常にそうとは限りません。

于 2012-11-26T02:30:10.310 に答える