导出对象后何时释放 dll

When to free a dll after exporting object

我正在通过以下方式从 dll 中导出函数:

extern "C" __declspec(dllexport) carsim::ICar* __cdecl createCarPlugin() {
     return new CarPlugin();
}

在我的主程序中,我显式加载了 dll 以提取此方法。接口 ICar 的声明被 dll 和主程序识别:

std::shared_ptr<ICar> PluginFactory::loadCarPlugin(const std::string& sCar) {
HINSTANCE oDllHandle = ::LoadLibrary(TEXT(sCar.c_str()));
if (!oDllHandle) {
    throw std::string("Could not LoadLibrary: "+sCar);
}

ICarFactory vFactoryFunc = reinterpret_cast<ICarFactory>(::GetProcAddress(oDllHandle, "createCarPlugin"));
if (!vFactoryFunc) {
    ::FreeLibrary(oDllHandle);
    throw std::string("Could not GetProcAddress: createCarPlugin");
}

std::shared_ptr<ICar> pResult(vFactoryFunc());

//::FreeLibrary(oDllHandle);

return pResult;
}

代码工作正常,除了一个问题:如您所见,FreeLibrary 函数被注释掉了。那是因为我不确定何时必须释放图书馆。 ICar-Object 被放入一个共享指针中,所以它会(希望)在程序完成时被销毁。但是当我尝试在代码中释放库时,程序无法运行。

我必须在程序停止之前释放它吗?

任何帮助将不胜感激:)

DLL 需要在您使用期间保持加载状态,这包括使用 ICar 实例。如果您释放该库,然后在该 ICar 上调用函数,该函数可能不再存在 - 您已释放它。

说 "I do not really need the dll after exporting the object" 是不正确的 - DLL 是该对象的代码所在的地方。

如果您希望 DLL 在程序的整个生命周期内保持加载状态,则无需显式释放它 - 当进程退出时它会自动清理。