2010-12-13 9 views
3

C++では、DLLがそれをロードしたアプリケーションのシンボルにアクセスすることは可能ですか? 私はプラグイン(dll)をロードするアプリケーションを持っており、これらのプラグインはアプリケーションのいくつかのAPIにアクセスする必要があります。DLLはそのアプリケーションのシンボルにアクセスする必要があります

このAPIを共有する新しいDLLを作成せずにこれを行うことは可能ですか?

この状況では、関数ポインタの構造体は適切ですか?

例:boolホストアプリケーションで定義されたLog(char *)関数と、いくつかのイベントを記録する必要のあるプラグイン。

答えて

2

コールバックインターフェイスをプラグインDLLに渡すための別の投票です。私。コールバック・インタフェース...

class IHostApplication 
    { 
    public: 
    virtual bool Log(const wchar_t* ip_log_string) = 0; 
    }; 

DLLプラグイン・インターフェース

class IPlugin 
    { 
    public: 
    virtual void InitializePlugin(IHostApplication *ip_host) = 0; 
    }; 

ホストがプラグインDLL(ダイナミック必要な場合)をロードし、次にプラグインにIHostApplication *として自身を通過します任意のコールバックを有効にすることができます。

+2

+1ですが、C++の上にプラグインアーキテクチャを構築するのは良い選択ですか?プラグインは、同じC++コンパイラでビルドする必要があります(バージョンではなく、少なくとも製造元でない場合)。 –

+0

あなたがそうすることができれば、いつも "C"をextern "C"にすることができます。もちろん、これはCスタイルのインターフェイスに限定されますが、それはトレードオフです。私はCOMを提案しますが、私はまっすぐな顔でそうすることはできません:) –

1

あなたのデザインの選択は疑問です。

EXEはDLLと同じように関数をエクスポートできますので、使い慣れた方法でGetProcAddressを使用できます。

しかし、プラグインは、ホストプログラムの内部機能について何か知る必要があるように設計したのはなぜですか?それは別の方法です。

ホストは、プラグインが特定の契約を守って(エクスポートする)一連のルーチンを実装することを要求する必要があります。インタフェースの一部として、ホストは必要に応じてホスト固有の情報を構造体へのポインタ(例えば、バージョン情報、機能)などに渡すことができます。

プラグインは、ホストモジュールへの関数ポインタを取得しようとしないでください。

+0

害はどこですか?プラグインはとにかく非常に具体的な契約を遵守しなければならず、ホストアプリケーション以外の誰かがプラグインをロードすると、おそらく動作しません。実行可能ファイルがプラグインのいくつかのシンボルをエクスポートしても呼び出すことができない場合、私は多くの害を見ることができません。 –

0

コールバック関数ポインタ、コールバック関数ポインタのリスト、またはコールバックインタフェースへのポインタ - これらのオプションの1つを使用します。 DLLクライアントは、コールバックインタフェースを実装し、動的に作成されたDLLにこのインタフェースへのポインタを渡す必要があります。ダイナミックに作成されたDllはこのポインタを保持し、必要に応じてその関数を呼び出して、たとえばいくつかのイベントを報告します。

関連する問題