0

Javaでプラグインのようなものを作る方法はないかと思っていたので、メインプログラムはサブプログラムをロードしてそれらの機能を実行します。いくつかの値を返す小さなプログラムのセットについて考えましたが、プラグインがメイン プログラム オブジェクトの一部を変更できるようにしたいと考えています (おそらく何らかの方法でポインターを渡しますか?)。

これを行う方法はありますか?

返信ありがとうございます。

4

1 に答える 1

1

動的にリンクされたライブラリ (Windows では DLL:s) の形式で、実行時にコードを動的にロードすることができます。

私が使用するアプローチ(少なくともWindowsを扱う場合)は次のとおりです。

  • いくつかのエクスポートされた関数 (__declspec(dllexport) で宣言) を含む dll を作成します。
  • Windows-API の LoadLibrary 関数を使用して、作成したファイルを実行時にロードします。
  • 関数の名前を使用して、関数 GetProcAddress-function を使用して、メンバー関数への関数ポインターをその名前で取得します。

C++ は名前マングリングを使用して戻り値の型などを追跡するため、最後の部分は少し混乱することがあります。これは、DLL に格納されている名前が関数の名前ではなく、関数のパラメーターの型などの説明も含む名前であることを意味します。

名前マングリングを防ぐために、エクスポートされた関数を次のように extern "C" で宣言できます。

extern "C" __declspec(dllexport) int myFunction(...);

ただし、これは関数宣言内のクラスを許可しません。

動的にリンクされたライブラリと "メイン プログラム" の間でデータ構造へのポインターを渡す際に考慮すべき重要なことは、型の宣言が 2 つのファイルで同じであることを確認することです (型を宣言するヘッダーを共有することで簡単に実現できます)。そうしないと、プログラムの実行時に重大なエラーが発生します。

繰り返しますが、これはおそらく Windows 固有のものですが、システムでの正しい手順のヒントになるかもしれません。

于 2012-06-02T15:28:48.943 に答える