2012-04-17 3 views
2

Добрый день, все!FreeLibrary блокирует мое приложение

Я написал некоторую dll, которую я использую в своем проекте. В constuctor класса я загружаю библиотеку lib = LoadLibrary(L"library.dll");, в деструкторе я освобождаю его с помощью if (lib) FreeLibrary(lib);

несколько раз приложений блоков, когда FreeLibrary называется, что я делаю неправильно?

я реализую DllMain, но это не решает мою проблему = (

в файле .h

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved); 

extern "C" { 
    static projector::CProjCorrectionsClient* corrections; 

    void DLLPROJECTOR_EXPORT CorrectionsInit (const char* configFile); 
    void DLLPROJECTOR_EXPORT CorrectionsApply (); 
} 

в CPP файле

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) 
{ 
    switch(fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      qDebug() << "DLL_PROCESS_ATTACH"; 
      corrections = new projector::CProjCorrectionsClient(); 
      break; 

     case DLL_THREAD_ATTACH: 
      break; 

     case DLL_THREAD_DETACH: 
      break; 

     case DLL_PROCESS_DETACH: 
      qDebug() << "DLL_PROCESS_DEATTACH"; 
      delete corrections; 
      qDebug() << "Corrections delete success"; 
      break; 
    } 
    qDebug() << "Out side dllmain switch"; 
    return TRUE; 
} 

На консоли я вижу эти сообщения:

DLL_PROCESS_ATTACH Внешний переключатель dllmain < ...> Попытки освободить библиотеку DLL_PROCESS_DEATTACH Коррекцию удалить успех Out стороны DLLMain переключения

Там нет сообщений после FreeLibrary вызова и приложений замораживания.

ответ

1

Вопрос должен быть, может быть, - «что делает dll неправильно?». Если библиотека будет выгружена, потому что счетчик ссылок достигнет нуля, то FreeLibrary даст DLL возможность очистить и вызовет DllMain с помощью DLL_PROCESS_DETACH. Возможно, попробуйте отладить DLL, чтобы узнать, что происходит, когда происходит это событие. Также, если в DLL есть статические данные, которые могут запускать деструкторы, возможно, проблема там.

+0

В моей dll нет dllMain, а деструкторы называются где-то еще, но это выглядит неправильно. Я попытаюсь создать dllMain и выполнить то, что происходит. – Jeka

+0

Я использую dllMain, но это не решает мою проблему = ( Подробнее см. Вопросы – Jeka

+0

Возможно, ваша DLL также вызывает FreeLibrary, где-то в деструкторе, это может вызвать тупик, поскольку FreeLibrary имеет в ней критический раздел – Pete

3

Убедитесь, что вы не ожидали какой-либо темы внутри DLL_PROCESS_DETACH.

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

+0

Как это можно исправить, и как узнать, что поток whitch блокируется? Я не создаю ни одного ручного руководства – Jeka