2011-12-20 9 views
1

tldr;下に。DLLの代わりにEXEをプラグインとして使用 - 「一方通行」転送情報への方法

もう一度興味深い問題があり、私は楽しく興味深い解決策を探しています。

私の現在のプロジェクトでは非常にモジュール化されています。つまり、プログラムの機能が異なるモジュールに基づいて簡単に変更され、プログラムが適応します。

私はDLLプラグインを使用している典型的なルートから始めました。今これは正常にちょうど方法です、私はボックスの外で少し考えたいです。

私のプログラムに含まれているモジュールは、長時間実行される長期間のキャンペーンであり、一度に多くのプログラムが実行されます。だから、安定性は大きな問題なので、私はGoogle Chromeのことを考えました。プロセスであり、DLLやスレッドではありません。

私はフレームワークを進めており、各モジュール(これは現在EXEです)に関する情報を得る方法が必要です。今私のDLLフレームワークのために私はいくつかの情報を記入する "レジスタ"関数をエクスポートしていました。

私は自分自身に考えていましたねえ、EXEが関数をエクスポートすることができます、実際に動作するかどうかを見てみましょう...そうではありません。私はWindowsがこれらのことをどのように扱っているのかについていくつかの研究を行いました。私はPEヘッダーをハッキングしているように感じませんでした。

名前付きパイプとCLIパラメータを使用して、メインプログラムとモジュールexeの間でデータを転送することを計画しています。私は登録方法でそれを使うことができましたが、私はここで他の人の考えをしたいと思います。

tldr:私はプラグインのDLLの代わりにEXEを使用しています。輸出された「登録」機能のような1回の情報をDLL上で簡単にエクスポートする方法を探しています。思考?

+2

クロムのアプローチは、コンポーネントの不安定さに関するものです。 – OnTheFly

+0

これは一般に安定性とどう違うのですか? – ThievingSix

+0

@thievingクロムでは、ブラウザは実行するコードを制御できませんが、あなたは –

答えて

5

定義済みのエントリポイント(例:レジスタ関数)を持つDLLとしてモジュールを記述することも考えられます。次に、指定されたDLLをロードする実行可能ファイルを作成します。主なアプリケーションはドライバの実行ファイルを起動し、プラグインDLLの名前を付けます。

このように、依然として提供されなければならないAPIのセットを定義してエクスポートするのはまだ簡単ですが、依然として別のプロセスとして実行します。あなたが書いた1つの実行可能ファイルは、指定されたDLLをロードしてから、メインアプリケーションで必要なIPCを処理することができます。

+0

私はそれを考えましたが、DLLのエクスポート機能を維持するにはあまりにも多くのコードのようです。メイン→DLL→EXE? 私はそれをこのように分離することの重要な利点を逃していない限り。 – ThievingSix

+4

@ThievingSix:Markは代わりに 'Main - > EXE - > DLL'モデルを参照していました。 MainアプリケーションはローダEXEを生成し、ロードするDLLを通知します。次に、ローダーEXEはDLLをロードし、以前のようにエクスポートされた 'Register()'関数を呼び出します。 EXEは必要に応じてメインアプリとの間で通信します。これにより、DLLは既に持っているDLLを書き換えることなく、独自のプロセスで実行されます。 –

+0

@RemyLebeau:はい - あなたは正しいです。明確化のためにありがとう。 –

1

あなたは私が成功しTAutoObjectから継承するいくつかのプロジェクト、およびオブジェクトのためのCOM「プレーン」を使用しているなどの標準入力/標準出力、名前付きパイプ、ソケット、

+0

私は実際にstdin/stdoutを完全に忘れてしまった! – ThievingSix

0

を経由してプロトコルを定義することができます。ここのボーナスはIDLです。 .NET、VBA、および他の非Delphiのものとの相互運用性。実装者がDLL、exe、NTサービスを提供し、オプションでネットワーク経由でホスト(COM +/DCOM)を実行できるようにすることも可能です。マルチスレッドとロックについては、いくつかの考慮すべき事項がありますが、私はオンラインで知る必要があるすべてを見つけました。

0

(実行中の)exeが別の境界線で実行しているため、エクスポートされたシンボルは使用できません。しかし、LoadLibrary(Ex)を使ってイメージ(exe)を使ってexeを(ライブラリと同じように)ロードしてから、exeによってエクスポートされた関数を使用することができます。私はPeStudioをデバッグするときに(ちょうど楽しみのために)テストしました。 LoadLibraryを使用してPeStudio.exeのプロセス領域にロードされたchrome.exeのスナップショットを参照してください。

enter image description here

+0

残念ながら私はそれを試みました。 EXEのLoadLibrary()は、エクスポートされた関数ではなくEXEからのリソースのロードに限られているようです。 – ThievingSix

+0

ntoskrnl.exeは多くの機能をインポートおよびエクスポートします。実際、これらのエクスポートされた関数の多くは、WIN32を使用するときに間接的に使用する関数です。もちろん、EXEでLoadLibraryを実行し、EXEによってエクスポートされた関数を使用することもできます。 – mox

+0

うーん、私はもう一度試してみる必要があります;) – ThievingSix