Почему бы не вызвать FreeLibrary из функции точки входа?
-
19-09-2019 - |
Вопрос
Я пишу DLL, которой необходимо несколько раз динамически вызывать отдельную DLL.Я хотел бы сохранить загруженность вызываемого абонента, а затем просто выгрузить его, когда моя DLL будет выгружена.Но, по мнению Microsoft, это плохая идея.
Функция точки входа должна выполнять только простые задачи инициализации и не должна вызывать никаких других функций загрузки или завершения DLL.Например, в функции точки входа вы не должны прямо или косвенно вызывать функцию LoadLibrary или функцию LoadLibrararyEx.Кроме того, вы не должны вызывать функцию фридалибровки, когда процесс завершается.
Вот код нарушения.Может ли кто-нибудь объяснить, почему мне не следует вызывать LoadLibrary и FreeLibrary из точки входа моей DLL?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_DETACH :
if (hLogLib != NULL) FreeLibrary(hLogLib);
break;
}
return TRUE;
}
Решение
Я думаю, что нашел ответ.
Функция точки входа должна выполнять только простую инициализацию или завершение задач.Он не должен вызывать функцию LoadLibrary или LoadLibrararyEx (или функцию, которая вызывает эти функции), потому что это может создавать петель зависимости в порядке нагрузки DLL.Это может привести к тому, что DLL будет использован до того, как система выполнит свой код инициализации.Аналогичным образом, функция точки входа не должна вызывать функцию фриэлемента (или функцию, которая вызывает фриэлибрацию) во время завершения процесса, поскольку это может привести к тому, что DLL используется после того, как система выполнила свой код завершения.
Другие советы
Вы не можете вызвать LoadLibrary из точки входа, поскольку функция DllMain выполняется внутри блокировки загрузчика ОС, и любые попытки повторно получить эту блокировку загрузчика (например, путем вызова LoadLibrary) приведут к взаимоблокировке.
Не делай что-нибудь значимое внутри DLLMain.Серьезно.Вызов FreeLibrary еще хуже, потому что он только иногда взаимоблокировка, если произойдет так, что ваша бесплатная версия уменьшит счетчик ссылок до нуля, и библиотека действительно будет освобождена.