Как я могу узнать, когда dllmain завершен? - PullRequest
2 голосов
/ 06 мая 2010

У меня есть работа, которую нужно завершить в DLL, как только она будет загружена. Работа включает в себя синхронизацию и поэтому не может быть выполнена внутри dllmain. Есть ли способ инициировать выполнение кода, как только dllmain (или все dllmains) завершится?

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

Согласно этой записи MSDN :

Во время запуска процесса и DLL процедуры инициализации, новые потоки могут быть созданы, но они не начинаются выполнение до инициализации DLL сделано для процесса.

Если это так, то вы сможете выполнять свою работу в обсуждаемом потоке, который не запустится до завершения DLLMain. Конечно, это оставляет некоторые возможные проблемы с синхронизацией открытыми. Если вы используете Mutex, возможно, вы сможете решить эту проблему.

ПРИМЕЧАНИЕ. Я не пробовал этого, просто теоретически это может работать.

P.S. Если вы попробуете это, пожалуйста, оставьте комментарий о том, сработало это или нет.

2 голосов
/ 06 мая 2010

С моей точки зрения, это долгая проблема. Если DLL используется сторонними приложениями, над которыми у вас нет контроля, трудно заставить другие приложения вызывать какую-либо функцию инициализации. В конечном счете, это может быть требованием, но, конечно, приятно не делать этого, чтобы использовать DLL (например, инициализировать winsock).

Если вызов инициализации невозможен, вероятно, вам нужно полагаться на отложенную инициализацию, которая происходит по требованию. Я наткнулся на довольно приличную статью о DLL Best Practices , которую, возможно, стоит прочитать. В нем есть хороший список конкретных вещей, которые вы можете и не можете делать внутри DLLMain. По своему опыту я знаю, что их необходимо соблюдать (список «не»).

0 голосов
/ 06 мая 2010

Самый простой способ - это поместить весь код в другую функцию, которую вы вызываете после загрузки библиотеки.

Вы также можете создать поток, который выполняет эту работу, но я не совсем уверен, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...