Ограничения использования в процессе присоединения и отсоединения DllMain - PullRequest
6 голосов
/ 29 апреля 2011

У одного моего коллеги возникли проблемы во время процесса DllMain Detach. Его ошибка, кажется, появляется не во всех случаях, но довольно часто.

Пытаясь помочь ему, я вспомнил о некоторых ограничениях использования во время процесса присоединения и отсоединения DllMain , но я не уверен, что хорошо помню, поскольку это были 2-летние технические обсуждения, не я работаю над этими вопросами.

А именно, я помню, что мы должны:

  • Избегайте использования операторов new и delete и предпочитайте выделение памяти HGLOBAL
  • Избегайте работы с окончаниями потоков здесь.

Не могли бы вы исправить меня, если я ошибаюсь, объяснить, если я когда-либо, или указать техническую статью, которая будет иметь дело с этими проблемами.

Ответы [ 3 ]

7 голосов
/ 29 апреля 2011

Избегайте вызова LoadLibrary и связанных с ним API.

В дополнение к ссылке Стива, есть несколько хороших релевантных сообщений от The New New Thing * Рэймонда Чена :

3 голосов
/ 29 апреля 2011

Большинство проблем возникает из-за конфликтов по поводу блокировки загрузчика. DllMain не должен быть длительным или использовать блокировки, если этого можно избежать.

Хороший фон здесь .

1 голос
/ 28 февраля 2017

Поиск документов по темам

[1] «Главная точка входа Dll»

[2] «Ограничения библиотек DLL с задержкой загрузки»

[3] «Рекомендации по использованию библиотеки динамических ссылок»

[4] Джефри Рихтер, Windows через C ++, глава 20.

(Извините, я не могу дать ссылки на URL из-за политики stackoverflow)

Резюме

  1. Возможно, другая DllMain уже была выполнена, а может и нет. Не вызывайте функции из других DLL

  2. Не называйте следующие вещи: "FreeLibrary / LoadLibrary / CreateProcess / ExitThread / GetStringType"

  3. Не вызывать функции из User32.dll, Gdi32.dll

  4. Если CRT не инициализирован, не используйте из него функции управления памятью (мое мнение, что ограничено только для фазы инициализации)

  5. Вы должны понимать, в каком контексте потока вы находитесь из документации.

  6. Законно делать следующее: Создавать и инициализировать объекты синхронизации. Открывайте, читайте и пишите в файлы.

...