2011-07-26 167 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