если вы устанавливаете пользовательскую точку входа в DLL - на данный момент crt в отдельных DLL уже инициализирован, но ваш статический crt нет (как и глобальные объекты). из этой пользовательской точки входа вам нужно будет позвонить

була: Этот вопрос конкретно касается и только поведениядинамический ЭЛТ используется через/MD, Это не ставит под сомнение обоснованность любых других рекомендаций в отношении.DllMain.

Какнам сказали: (ссылка: Рекомендации библиотеки Dynamic-Link, MSDN, 17 мая 2006 г.)

Вы никогда не должны выполнять следующие задачи из DllMain:

...Используйте функцию управления памятью издинамический C Run-Time (CRT). Если библиотека CRT не инициализирована, вызовы этих функций могут вызвать сбой процесса....

другиепоставили под сомнение это уже (как в: подверг сомнению обоснованность аргумента), и так как мы услужливо получаем ответ там, мы можем ясно видеть один скореепросто случай, когда это моглопотенциально может вызвать проблемы:

Вы работаете с предположением, что точкой входа для DLL всегда является _DllMainCRTStartup. Это не тот случай, это просто компоновщик по умолчанию. Это может быть все, что программист хочет, чтобы это было быстро и легко изменить с помощью опции компоновщика / ENTRYPOINT. Microsoft ничего не может сделать, чтобы предотвратить это.

Итак, вот элементы этого вопроса:

Естьлюбой другой ситуация при связывании/MD а такжене поставка на заказ/ENTRYPOINT, гдединамический CRT не должен быть полностью инициализирован?

В частности, если вся загрузка DLL выполняется только через «статические зависимости», то есть без явногоLoadLibraryзвонки на всех, просто ссылки времени библиотеки DLL.

Бонус: MS документы специально взывать«функция управления памятью», но, насколько я могу судить, если CRT не инициализирован, потенциальноЛюбые Функция CRT должна быть небезопасной. Зачем вызывать функции управления памятью таким образом?

№ 3:

Wrt. к обычаюENTRYPOINTЯ не совсем понимаю, как это может быть настолько важным сценарием, что его нужно включить в список not-do-in-DllMain без дальнейшей квалификации.IFF Я предоставляю пользовательскую точку входа, я отвечаю за правильную инициализацию CRT илиCRT не будет работать должным образом нигде в моей программе, а не только DllMain. Зачем специально вызывать часть DllMain?

Это возвращает меня к вопросу 1, а именно, если это единственный сценарий, когда это проблематично длядинамический CRT. Было бы полезно получить разъяснение или откровение, почему для DllMain это было бы более важно, чем для других частей DLL, или что я мог бы здесь упустить.

Бонусные ссылки:

Когда глобальные объекты создаются и разрушаются в Visual C ++?DllMain: ужасная историяВызов LoadLibrary из DllMain

Обоснование: Я чувствую, что должен добавить это для контекста: я спрашиваю это, потому что у нас естьмассивный объемы кода, делающие вещи через глобальные конструкторы объектов C ++ Вещи, которые на самом деле сломались, были проверены на протяжении многих лет (например, одновременноLoadLibrary, синхронизация потоков и т. д.), но весь код полонstd Функции C ++ и CRT, которые успешно работали в течение многих лет на Windows XP, 7 и Windows 10 без каких-либо известных сбоев. Пока яне один, чтобы плакать «но это просто работает», я должен сделать инженерное заключение здесь о том, есть ли какая-то ценность от короткого до среднего в попытке «исправить» это. Поэтому я был бы признателен, если бы ответы мыльной коробки можно было оставить в своих коробках.

Ответы на вопрос(1)

Ваш ответ на вопрос