2

動的ライブラリ内のオブジェクトを参照するための標準file:または従来の URI スキームはありますか?http:

たとえば、ライブラリ内の関数を一意の文字列の形式で表現し、その関数を検索するために使用できる場合 (リフレクティブな手段で)、どのようにすればよいでしょうか?

具体的には、Objective-C でこれを開発しています。異なる言語/プラットフォームは異なる表現を持つと思います (.NET には独自のものがあることはわかっています)が、より一般的な意味でこれに興味があります。

4

1 に答える 1

1

いいえ、シンボルの名前はコード内の名前から派生しています。Windows では、C または C++ を想定します。

HMODULE module=LoadLibrary( [path to your dll] );
//If the exported name is foo.
Function foo=(Function)GetProcAddress(module,"foo");
//Call function
foo();
FreeLibrary(module);

エクスポートされた名前はコンパイラに依存します。

実際、そのような命名スキームはまったく役に立ちません。C++では、次のようなものを使用できます(関数プロトタイプごとに1つのFunctionCallerがあることに注意してください)

FunctionCaller("your-dll.dll/foo")();

FunctionCaller のコンストラクターがライブラリーをロードし、foo を呼び出してライブラリーを解放します。ただし、次の理由で良くありません。

  • 戻り値がライブラリ内のリソースを指していて、役に立たなくなることがあります

  • ライブラリのロードと関数ルックアップの実行は、見つかった関数の呼び出しに比べて遅い

あなたがすることは

  1. ライブラリをロードする

  2. 必要な関数をロードする

  3. 関数を使用する

  4. ライブラリを解放する

ここでは、一度に複数のシンボルを参照する必要があり、uri よりも複雑なスキームが必要になります。

編集:そのような関数を呼び出す利便性が必要な場合は、読み込まれたすべてのモジュールを保持し、読み込まれた各ライブラリの関数名からアドレスへのマップを含む、生き残った FunctionCaller オブジェクトを持つことができます。

于 2013-04-02T11:21:54.550 に答える