gpt4 book ai didi

c++ - 如何根据 DLL 端的请求卸载 DLL 模块?

转载 作者:行者123 更新时间:2023-11-30 03:21:09 27 4
gpt4 key购买 nike

我有一个主程序和一个 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 吗?

最佳答案

有一个函数正是用于此目的:FreeLibraryAndExitThread

关于c++ - 如何根据 DLL 端的请求卸载 DLL 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52293218/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com