Как выгрузить модуль DLL по запросу со стороны DLL, чтобы выгрузить его? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть основная программа и библиотека DLL. Оба кода можно обобщить, как показано ниже.

// DLL Module (Start)
class DllModuleClass : public IDllModuleInterFace
{
    public:
        // ...
        void Terminate() override
        {
            // ...
            pMainModuleObject->OnDllModuleObjectTerminated();   // Notify the main program that the DLL can be unloaded now.
            // Error occurs at this point (as soon as OnDllModuleObjectTerminated() returns), because it frees the DLL module and this region does not exist anymore.
        }
        // ...
    private:
        IMainModuleInterFace * pMainModuleObject;
}

IDllModuleInterFace * GetDllModuleClassInstance();
// DLL Module (End)

// Main Module (Start)
class MainModuleClass : public IMainModuleInterFace
{
    public:
        // ...
        void OnDllModuleObjectTerminated() override
        {
            FreeLibrary(hDllModule); // DLL module is freed from memory here.
        }   // Tries to go back to `Terminate()` inside the DLL module, but the DLL module is freed now.
        // ...
    private:
        IDllModuleInterFace * pDllModuleObject;
}
// Main Module (End)

В моем коде модуль DLL вызывает функцию в главном модуле, чтобы уведомить основной модуль о том, что DLL может быть выгружена. Основной модуль делает это, выгружает DLL из памяти. Но звонивший из DLL еще не вернулся. Итак, после выгрузки DLL в DLL все еще есть функция, которая все еще работает. Это вызывает очевидную и неизбежную ошибку времени выполнения.

Можете ли вы предложить правильный способ выгрузки DLL в этой структуре?

1 Ответ

0 голосов
/ 12 сентября 2018

Для этой цели есть функция: FreeLibraryAndExitThread.

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