そのため、QPlugin システムを使用する QT API に大きく基づいたアプリケーションがあります。使い方はかなり簡単です。インターフェイスから継承するクラスを定義し、プラグインが読み込まれると、そのクラスのインスタンスを取得します。最終的には、OS に適したdlopen
/dlsym
またはLoadLibrary
/に要約されます。GetProcAddress
ここで問題はありません。すべてが期待どおりに機能します。
それで、問題に。メイン アプリケーションによって提供されるデータ/関数を参照する必要があるプラグインを含む多くの機能があります。たとえば、私のアプリケーションには GUI があるので、アプリケーションに " plugin::v1::gui
" を返す関数がありますQWidget *
。プラグインで UI に何かを追加したり、そのダイアログを UI の子にしたりできるようにしたい場合は、それへのポインタが必要です。
私は Linux で開発を始めましたが、すぐに、デフォルトでは、ローダーが共有オブジェクト内の未解決のシンボルを、それをロードするアプリケーションからのシンボルで満たしていないという事実に遭遇しました。問題ありません。簡単に修正できます。-rdynamic
" " をフラグに追加して先に進みます。事はうまくいきます。
今、私は Windows に同等のものがないことを発見しました :(。では、良い解決策は何ですか?
これまでのところ、プラグインが気にする可能性のあるすべてのオブジェクト/関数へのポインターを持つメインアプリケーションに入力する構造を持つことが最善です。次に、それをプラグインの " init()
" 関数に渡すと、すべてへの適切なポインターが得られますが、何かを追加するたびに複数の場所で変更を加える必要があるため、面倒な解決策です。
より良い解決策はありますか?SO コミュニティはこれにどのように対処しましたか?