2011-07-26 12 views
0

共有オブジェクト(またはDLL)に関する質問があります。私は自分のゲームエンジン用のプラグインローダーに取り組んでいます。私はそれをやり始める前に一つの質問に答える必要があります。共有オブジェクト(DLL)に関する質問

外部関数を使用してデータを読み込むと、共有オブジェクトをアンロードできますか?ここで

は少しのコードスニペットです:私はdcloseを呼び出すとき

//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; 

} 

は、データが間接参照得るのだろうか?

答えて

2

割り当てられたメモリは残りますが、そのプラグイン/ dllから関数を呼び出すことはできません。それはあなたのオブジェクトを役に立たなくします。

+0

これを乗り越える方法はありますか?共有オブジェクトの処理をどのように処理すればよいですか?問題の終わりに 'unloadPlugin(" PythonScripting ");を呼び出すことができるようにマップにそれらを格納する必要がありますか?編集:私は混乱していると思う。 'PythonScriptingSystem :: runFile'や他の関数は動かないでしょうか? (仮想関数です) – Gasim

+0

ありがとうございます。私は今それを得る:) – Gasim

+0

あなたはそれを使用し終わったらプラグインをアンロードする必要があります。これは自然以上のものです。どのように正確に...あなたのコード/アーキテクチャに依存しますか。プラグインをロードし、インスタンスへのポインタを提供し、uninited/destroyedがすべてのインスタンスを破棄し、プラグインをアンロードするプラグインマネージャを実装するべきでしょう。 – cprogrammer

関連する問題