- - PR -
アンマネージのC++でメンバクラスをもちつつ、VBから利用できるソフトの作り方
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-03-26 09:03
いま、作っているソフトで、基本の仕組みとして、特殊なデータベースが必要なのですが、どういう形でくみ上げていくかテスト中です。なお、本来のアプリケーションは、VBで概略出来上がってデータがメモリ上のみなら速度もなんとか合格しています。次に、2〜100GB程度のデータを256MBクラスのマシンでそこそこの効率で処理できればOKなのですが、アプリの性格を利用した特殊DBを作ると簡単に解決できそうと、踏んでいます。
その場合の構成を思案中なのですが、ご意見をお願いします。 1案 VB→マネージC++→[DLLImport]→アンマネージC++ <良い点>: ○マーシャリング機能が使える。(今回は、渡すデータが限られているので、MSの用意しているマーシャリング機能は使わなくて済む。) ○将来、マネージC++とアンマネージC++の関係が変わっても、[DllImport]ではっきりと区切られているので、MSが差異を吸収する仕組みを提供してくれる可能性が大きい。 ○もしかしたら、アンマネージC++で、Staticであればメンバークラスを使える。(この辺が分かっていないのですが、メンバクラスをもつアンマネージクラスをVBから使えるようにするにはどうしたら、いいのでしょうか?) <悪い点> ○[DLLImport]部分で、2.8Gのマシンで20MSくらい直接Callよりも余分にかかる。 (直接のCallは1MS程度と思われる)、[DllImport]の使用は何百万回程度のLoopの中では耐えられない。したがって、アンマネージ部分を極大化して、[DllImport]を減らさないといけない。すると、アンマネージDLLの中で、クラスを定義して使ったりできるのか(Staticの制限つきであれ)実際のところがわかっていなくて、教えていただきたいところです。 2案 VB→マネージC++→アンマネージC++ [DllImort]を使わないという意味です <良い点> ○マネージから、アンマネージの関数を呼ぶ時間が短い。 ○VBからはマネージC++はDLLというものの、実際はフルに、メンバークラスをもち、あたかも通常のアプリのように、プログラムできるので、ある程度の規模のソフトを作る場合に、急に関数思考の、昔戻りを強要されないですむ。 <悪い点> ○マネージからアンマネージを呼ぶ時間は短いといっても、アンマネージのプログラム間でのCall時間に比して非常に長いのかも知れない。(測定すれば分かりますが、理論的に分かるほうがありがたいので、ご存知の方あれば、レスお願いします) ○将来マネージとアンマネージの関係が変わった時に、すべてを見直さないといけない。変わる理由は、マネージC++が変わる(MSのVersionUp)、およびアンマネージC++が変わる(たとえば、ボーランドやインテルのC++への私の乗り換え)こちらの場合でも、[DllImport]相当の仕組みを自分(と言うより、たとえばインテルが提供するソフト)で且つ20MSも時間を使って、置き換えることで、乗り換え問題が解決可能です。 ○アンマネージの側で、メンバークラスを持つことは、不可能と思います、すこしやってみましたが、Staticな変数でも、スコープがマネージとアンマネージにわたってしまうため、キチンと定義しきれないと思いました。そのため、アンマネージ側はクラスというより、関数思考で開発が必要です。したがって、断片的な処理(たとえば100MBのバファーを0で埋めるなど)をアンマネージ側でさせることになります。 案3 VB→メモリ→別プロセスのマネージC++とアンマネージC++の組み合わせ。 <良い点> ○DLLにまつわる、諸問題が一切ない。通常、DBはこの形に似た形で提供されており一般的。 <悪い点> ○仕組みがすこし複雑になる。 ○VBからのCall時間がかかりそうに思われる。 どなたか、このあたりで、非常に高速IPCの仕組みをヒントいただけるとありがたいです。 以上、一番の疑問はアンマネージのC++でメンバクラスをもちつつ、VBから利用できるソフトの作り方ということで、どんなご経験でも、直感でも、ヒントいただけるとありがたく、よろしくお願いします。 |
1