У меня есть основная программа и библиотека 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 в этой структуре?