2011-07-26 237 views
0

我有一个关于共享对象(或DLL)的问题。我正在为我的游戏引擎开发一个插件加载器。不过,我需要在开始做这件事之前回答一个问题。共享对象(DLL)问题

如果我使用外部函数加载数据,我可以卸载我的共享对象吗?

这里是一个小的代码片段:

//The Plugin: 
class PythonScriptingPlugin : public Plugin { 
    void * system; 
public: 
    PythonScriptingPlugin() { 
     system = new PythonScriptingSystem;  
    } 

    void * get() { return system; } //derived 

}; 

extern "C" { 

    Plugin * libLoadPlugin() { 
     return new PythonScriptingPlugin; 

    } 

} 

//main app: 
void * loadPlugin() { 

    void * handle = dlopen(Base::fs()->file("plugins", "libPythonScriptingPlugin.so"), RTLD_LAZY | RTLD_GLOBAL); 
    typedef (void*)(*loader)(); 
    loader * libLoadPlugin = dlsym(handle, "libLoadPlugin"); 

    void * data = libLoadPlugin()->get(); 
    dlclose(handle); 
    return data; 

} 

会当我打电话D关闭数据获得非关联?

回答

2

不,分配的内存仍然存在,但是您将无法从该插件/ dll调用任何函数。这使你的对象无用。

+0

有没有办法克服它?我应该如何处理共享对象关闭?我应该将它们存储在地图中,以便我可以调用'unloadPlugin(“PythonScripting”);'在问题结束时?编辑:我想我很困惑。 'PythonScriptingSystem :: runFile'或其他函数不起作用? (他们是虚拟功能) – Gasim

+0

谢谢。我现在得到它:) – Gasim

+0

当您完成使用它时,您必须卸载插件。这比自然更重要。如何......取决于你的代码/架构。你可能应该实现一个加载插件的插件管理器,提供一个指向实例的指针,以及何时uninited/destroy破坏所有实例并卸载插件。 – cprogrammer