CRT инициализация и DLLMain
Цитаты:
Из документа «Рекомендации по созданию библиотек DLL»http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565f5b/DLL_bestprac.doc Microsoft:
«DLL часто имеют сложные взаимозависимости, которые неявно определяют порядок их загрузки. Загрузчик библиотеки эффективно анализирует эти зависимости, вычисляет правильный порядок загрузки и загружает библиотеки DLL в этом порядке».[1]
«(в DLLMain) Используйте функцию управления памятью из динамического C-Run-Time (CRT). Если CRT DLL не инициализируется, вызовы этих функций могут вызвать сбой процесса».[2]
Из MSDN:http://msdn.microsoft.com/en-us/library/988ye33t.aspx
«Функция _DllMainCRTStartup делает несколько вещей, включая вызов _CRT_INIT, который инициализирует библиотеку времени выполнения C / C ++ и вызывает конструкторы C ++ для статических, нелокальных переменных. Без этой функции библиотека времени выполнения оставалась бы в неинициализированном состоянии «.[3]
«В дополнение к инициализации библиотеки времени выполнения C _DllMainCRTStartup вызывает функцию с именем DllMain».[4]
Вопросы:
Если ваша DLL зависит от CRT DLL, на основе[1], Библиотеки CRT будут загружены первыми (будут инициализированы первыми), так как[2] могло случиться ?
На основе[3] а также[4], _DllMainCRTStartup вызовет _CRT_INIT, который инициализирует CRT, так как[2] могло случиться ?
Если исполняемый файл загружает вашу DLL с помощью «неявного связывания», _DllMainCRTStartup (и DLLMain) вашей DLL будет вызываться перед точкой входа (mainCRTStartup или WinMainCRTStartup) исполняемого файла на основе[3] - _DllMainCRTStartup вызывает _CRT_INIT, который инициализирует CRT, и mainCRTStartup также собирается инициализировать CRT, так что же на самом деле произошло с CRT?
Если ваша DLL будет загружена до mainCRTStartup, вызов функций CRT в DLLMain или других функций экспорта безопасен или нет?
Кто будет инициализировать библиотеки CRT на самом деле?