Windowsのx64の上で32ビットと64ビットアプリケーション間のプロセス間通信

StackOverflow https://stackoverflow.com/questions/505647

  •  21-08-2019
  •  | 
  •  

質問

私たちは最近、中止されたいくつかのハードウェアをサポートしたいと思います。ハードウェアのためのドライバは、普通、32ビットのC DLLです。私たちは、ソースコードを持っているし、(法的な理由のために)逆コンパイルに興味がないか、ドライバをリバースエンジニアリングしないでください。

ハードウェアは迅速にデータのトンを送信し、その通信プロトコルはかなり効率的にする必要があります。

当社のソフトウェアは、ネイティブ64ビットC ++アプリですが、私たちは、32ビットプロセスを経てハードウェアにアクセスしたいと思います。相互に通信するための32ビットおよび64ビットのアプリケーションのための効率的な、エレガントな方法(理想的には、新しいプロトコルを発明関与しない、ということ)は何ですか?

この溶液をC / C ++でなければならない。

更新:いくつかの回答者が、これはユーザーモードまたはカーネルモードドライバーであったかどうかを明確化を求めました。幸いなことに、それはユーザーモードドライバです。

役に立ちましたか?

解決

これは実際のドライバ(カーネルモード)がある場合は、SOLのです。 Vistaのx64のは、署名のないドライバをインストールすることはできません。また、これは単なるユーザーモードのDLLである、あなたは標準のIPCメカニズムのいずれかを使用して修正を得ることができます。パイプ、ソケット、外のインプロセスCOM、おおよそそのためです。それはすべてあなたが、コンテキストスイッチのオーバーヘッドがあまりにも多くを傷つけるべきではない十分なデータをバッファリングすることができますように限り、バス速度で動作します。

他のヒント

私はソケットを使用します。それはあなたが将来的にそれを必要とする場合は、IP上でそれを使用できるようになる、とあなたは1つのメッセージングAPIに縛られることはありません。将来的にはあなたが別のOSや言語にこれを実装したい場合は、次のことができます。

この記事には興味があるかもしれません。それは、問題を議論して、ソリューションとしてCOMを使用することを提案しています。私はCOMの大ファンではないが、Windowsの世界でその普遍性を与え、それが十分に効率的であるかもしれない可能性があります。あなたはバッチデータは、(あなたはデータの項目ごとに1つのCOM呼び出しを行うにはしたくない)ことができるようにあなたは、おそらく建築家にあなたのソリューションをお勧めします。

エレガントな? C ++? DCOM / RPCはうまくいくかもしれない、または名前付きパイプを作成し、(多分「CMessageクラス」か何かを作成する)は、2つのプロセス間で話をすることを使用し、しかしx86およびx64の間で異なる構造のアライメントに気を付けることができ、自分自身への呼び出し。

ドライバが実際のドライバであることが判明した場合、nobugzはほとんど右である - あなたは難しく、多くの仕事をしなければならないとしている、あなたは完全にSOLじゃありません。一つの解決策は、このようなソケット(Pyrolisticalによって示唆されるように)またはUDPまたはMQ又はために、非常に高いスループットをサポートすると主張さえTibcoのランデブー(として、いくつかの他のマシン(または仮想マシン)上でのWin32をインストールし、RPCのいくつかのフォームを使用することです金融市場によって生成されたデータのボリュームを処理するために - 。少なくとも、それは私が昔に戻ってから覚えているものです)

両側で共有メモリマップファイルは、同一の内容を有することになります。 OSは、それを実現するために、いくつかの興味深いポインタのものを行う必要がありますが、非常に可能性の高いあなたは物理的に周りのメモリをコピーしていないような方法で、2つのビューセットアップすることができるようになります。ゼロコピーは、それが

を取得と同じくらい良いです
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top