Глобальные конструкторы и MSVCRT в DLL

Что происходит со следующим кодом в 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 … который, насколько я понимаю, не гарантированно будет отображен на этом этапе. Это получает специальное лечение?

3

Решение

От Вот:

В двух словах, когда DllMain загрузчик ОС находится в довольно хрупком состоянии. Во-первых, он применил блокировку к своим структурам, чтобы предотвратить внутреннее повреждение во время этого вызова, а во-вторых, некоторые из ваших зависимостей могут быть не полностью загружены. Перед загрузкой двоичного файла OS Loader проверяет его статические зависимости. Если те требуют дополнительных зависимостей, это смотрит на них также. В результате этого анализа получается последовательность, в которой DllMains из этих двоичных файлов должны быть вызваны. Это довольно умно в отношении вещей, и в большинстве случаев вы можете даже не соблюдать большинство правил, описанных в MSDN, но не всегда.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]