プラグインで拡張したい Qt でアプリケーションを作成しています。私のアプリケーションには、プラグインが使用するライブラリもあります。だから、私は双方向のコミュニケーションが必要です。基本的に、プラグインはライブラリを呼び出すことができ、プラグインをロードする私のアプリケーションはそれらを呼び出します。
現在、私のライブラリは C++ で書かれているので、いくつかのクラスがあります。プラグインはヘッダー ファイルをインクルードし、それにリンクして使用できます。また、プラグインが実装する必要がある抽象基本クラスである、インターフェイスを含むヘッダー ファイルもあります。また、そのクラスへのポインターを返す関数をエクスポートし、C リンケージを使用する必要があります。
ここまでは、すべてが明確で、標準のプラグイン インターフェイスであると思います。ただし、3 つの主な問題、またはサブタスクがあります。
他の言語からライブラリを使用するには? Pythonのみでこれを試しました。SIP を使用して Python コンポーネントを生成し、それを test.py ファイルに正常にインポートして、ライブラリ内のクラスから関数を呼び出しました。他の言語で試したことはありません。
他の言語で抽象クラスの適切な宣言またはスタブを生成するにはどうすればよいですか? プラグインはこのクラスを実装する必要があるため、Python の .py ファイル、Java の .class ファイルなど、他の言語のヘッダーに相当するものを何とか生成できるはずです。これはまだ試していませんが、他の言語用のジェネレータがあるとします。
プラグインでオブジェクトのインスタンスを作成するにはどうすればよいですか? ここまで来れば、クラスはプラグインに実装されます。ここで、実装された抽象クラスのインスタンスを返す関数を呼び出し、それへのポインターを取得する必要があります。私の調査によると、これを機能させるには、Python インタープリター、JVM などのハンドルを取得し、そこからプラグインと通信する必要があります。
それほど複雑には見えませんが、調査を開始したときは、最も単純なケースでもかなりの作業が必要でした。そして、私は最初のポイントにのみ、Pythonでのみ成功しました。それは私が正しいアプローチを取っているかどうか疑問に思いましたか?これについてどう思いますか..ライブラリと抽象基本クラスでQtを使用するべきではなかったかもしれませんが、純粋なC ++のみを使用する必要がありました。おそらく、物事が少し簡単になる可能性があります。または、ライブラリで C のみを使用し、プラグインがクラスではなく C 構造体を返すようにするべきだったのかもしれません。ライブラリを呼び出すのは些細なことなので、物事がずっと簡単になると私は信じています。そして、C 構造体の実装は、C++ クラスを実装するよりもはるかに簡単であり、Qt オブジェクトを使用する C++ クラスを実装するよりもさらに簡単だと思います。
私を正しい方向に向けて、これに関するあなたの専門知識を共有してください。また、このテーマに関する本をご存知でしたら、喜んで購入させていただきます。または、これに対処するいくつかのリンクが必要です。