Что происходит со следующим кодом в 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 … который, насколько я понимаю, не гарантированно будет отображен на этом этапе. Это получает специальное лечение?
От Вот:
В двух словах, когда
DllMain
загрузчик ОС находится в довольно хрупком состоянии. Во-первых, он применил блокировку к своим структурам, чтобы предотвратить внутреннее повреждение во время этого вызова, а во-вторых, некоторые из ваших зависимостей могут быть не полностью загружены. Перед загрузкой двоичного файла OS Loader проверяет его статические зависимости. Если те требуют дополнительных зависимостей, это смотрит на них также. В результате этого анализа получается последовательность, в которойDllMain
s из этих двоичных файлов должны быть вызваны. Это довольно умно в отношении вещей, и в большинстве случаев вы можете даже не соблюдать большинство правил, описанных в MSDN, но не всегда.
Других решений пока нет …