Почему бы не вызвать FreeLibrary из функции точки входа?

StackOverflow https://stackoverflow.com/questions/1903008

Вопрос

Я пишу 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 еще хуже, потому что он только иногда взаимоблокировка, если произойдет так, что ваша бесплатная версия уменьшит счетчик ссылок до нуля, и библиотека действительно будет освобождена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top