0

モジュラーという言葉が正しいと思います。メモ帳のように入力して暗号化して保存できる暗号化アプリケーションを作成する場合の基本的な例を挙げると、保存メニューの下に、AES、Blowfish などのプラグインがある暗号化方法を保存するオプションがあります。また、メイン アプリケーションを再コンパイルすることなく、新しいメソッドをプラグインにコーディングして配布することもできます。

オンラインでいくつかの説明を見つけましたが、元々存在しなかった保存メニューの下に新しいオプションを表示する方法を理解するのにほとんど苦労しています(これはおそらくWindowsアプリケーションの質問です)。私が意味することを理解してください。

モジュラー開発は非常にプラットフォーム固有のように見えるので、今のところ Windows の例に固執し、うまくいけば後で試してみます。

4

4 に答える 4

3

Win32api の場合、次のようにします。

  • アプリケーション用のプラグイン ディレクトリを用意します。
  • アプリケーションのロード時に、そのディレクトリ内のすべてのファイルを一覧表示します
  • 拡張 DLL を使用する場合は、LoadLibrary呼び出しでロードします。
  • プラグインの名前が何であるかを示す情報を dll から取得します。
  • メニュー/UI の変更を適切に作成します。

これで、dll を作成すると、すべてのプラグインに共通の標準関数セットが作成されます。または、プラグインのタイプごとの関数の標準セットと、これをアプリケーションで識別する関数。このようにして、各プラグインが正しい形式であることをテストし、動的ライブラリのメソッドをその場で呼び出すことができます。それらをメイン プログラムにコンパイル/リンクする必要はありません。

このルーチンは、共有ライブラリ (DLL など) をサポートするすべてのプラットフォームで広く似ています。

私が言いたいことのコード例として、次のような plugin.h ファイルがあるかもしれません:

#ifndef PLUGIN_H_
#define PLUGIN_H_

#define PLUGIN_CRYPTO   1
#define PLUGIN_FORMAT   2
#define PLUGIN_EXAMPLE  3

#endif 

次に、このヘッダーをメイン プログラムと作成するプラグインの両方に #include します。plugin-dll.cpp (再び例) には、次のようなメソッドがあります。

int GetPluginType()
{
    return PLUGIN_CRYPTO;
}

次に、この関数の結果を切り替えて、実行する正しいルーチンに関数ポインタを割り当てることができます。

実装の詳細情報:

という理由だけで、Linux (POSIX) の同等物:

  • dlopen - 動的ライブラリを開きます.
  • dlsym - GetProcAddress と同等 - シンボル名への関数 ptr を取得します。
  • dlclose - FreeLibrary と同等
于 2010-02-19T01:06:35.287 に答える
0

Windows には、実行時にメニュー エントリを挿入、削除、および再配置できる ModifyMenu という名前の関数が含まれています。より難しい (それほど難しくはありません) 部分は、メニュー エントリが実際にアドオン機能を呼び出すように接続することです。

メニュー項目を選択すると、特定の番号を含むメッセージがプログラムに送信されます。従来の C プログラムには、その数値に基づいて何を行うかを決定するための大きな switch ステートメントがあります。実行時に追加されるプラグインの場合、switch ステートメントを使用できないため、代わりに通常、代わりにある種のマップ構造を使用します。

于 2010-02-19T01:04:41.847 に答える
0

実行時にメニューに入力するという Jerry の説明に加えて、暗号化/復号化や plugin_name などの特定の機能を提供する新しい dll ファイルのセット フォルダー (アプリケーション フォルダー\プラグインなど) をスキャンする必要があります。Windows には次の機能があります。実行時にDLLファイル内のものを調べます。

于 2010-02-19T01:07:33.417 に答える
0

これを c# と書くと、MEF http://www.codeplex.com/MEFを使用できます。

本当のマゾヒストだけが、この種の GUI クライアントを C++ で記述します (flaming の待機)。

于 2010-02-19T01:30:52.507 に答える