2010-05-05 3 views
2

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

ответ

3

По this MSDN post:

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

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

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

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

+0

Как примечание: документ «лучшие практики», упомянутый в ответе Марка Уилкинса, рекомендует не вызывать 'CreateThread()' (хотя он и признает, что это можно сделать). Протестируйте внимательно, если вы решите пойти по этому маршруту. –

+0

Я согласен, что лучший способ сделать это - создать процедуру инициализации и иметь пользователей вызова DLL, которые являются частью API. Это обычное дело, например, WinSock и IBM MQSeries –

+0

Скручивание потока, похоже, сработало. По словам Раймонда Чена, вы должны быть осторожны, что вы там делаете, потому что вы можете зайти в тупик, если вы ждете от этого потока изнутри dllmain. См. Http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx –

0

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

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

2

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

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

Смежные вопросы