Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

COM featuring ローカルリソース

当ブログはCOMをメインに扱うとは言ったが、それは俺のCOMに関する勉強を兼ねてのことであり、従って、まだCOMに関するまともな記事(ブログの記事機能ではなく静的サイトにする予定だ)を一つも書いていない現状では、俺はCOMに対するロクな知識を持っていないということが帰結される。

というわけで教えてぷりーづ(以下の文章に間違いがあったらご指摘願いたい)。

COMの(正確にはDCOMの)特徴の一つに、ローカル/リモート透過性がある。コンポーネントの実体がどこ(自アパートメント内/自プロセス内/自マシンの他プロセス内/他マシン内)にあるかを意識することなく、そのコンポーネントのメソッドを呼び出せる。
これは、アパートメント境界を超えるときにはプロキシとスタブというペアが働くためだ。プロキシは自アパートメント内にあって、他アパートメントにあるコンポーネントへ要求を送り出す役割を果たし、スタブは相手のコンポーネントと同じアパートメント内にあって、プロキシから受け取ったデータをコンポーネントに渡す役割を持つ。戻り値も同様の経路で中継される。
プロキシ/スタブのペアが行うこのデータ中継を「マーシャリング」と呼ぶ。

だが、プロキシ/スタブが存在しないインターフェイスもある。そういったインターフェイスは、IDLでlocal属性をつけて定義する。
ここで、コンポーネントではなくインターフェイスに制約が課されるというのは興味深い。
COMにとってコンポーネントとは隠すべき実装詳細であり、コンポーネントがある場所も実装詳細であるにも関わらず、local属性はインターフェイスによって表明される。
これは、マーシャリングに関する知識を持っているのが、コンポーネントではなくインターフェイスだからである。
これは、同じインターフェイスを実装するすべてのコンポーネントは、同じプロキシ/スタブを利用することを意味する。

さて、本題。

限定的ローカルリソース(と、即興で今命名した)リソースを扱うコンポーネントを作るにはどうしたらよいのだろうか。
例えば、自プロセス内でしか有効でないリソース(GDIオブジェクトを含むものとか)や、自マシン内でしか有効でないリソース(ファイルなど)である。
前者はアパートメントを越えて有効であるし、後者はプロセスを越えて有効であるが、いずれも越えられない壁がある。
このため、マーシャリングは必要(よって、プロキシ/スタブも必要で、インターフェイスはlocal指定できない)なのだが、しかし、そういった限定的なマーシャリングのみを許可するプロキシを作ることはできるのだろうか。あるいは、IMarshalのカスタム実装が必要になるのだろうか(プロセスローカルリソースはFTMが使えるかもしれないが)。

こういったローカル/リモート透過性を持たないリソースを扱うにはCOMは適さないという結論にならないことを祈るばかりである。

投稿日時 : 2007年2月23日 12:52

Feedback

# re: COM featuring ローカルリソース 2007/02/23 14:23 とっちゃん

うーん。それらしいの見つからないなぁ。
基本的にプロセス境界を越えられるものはマシン境界も越えられるものとされちゃってるからなぁ...

なので、運用フォローなのかもしれない。
DCOM(今はCOM+)の設定情報はCOMの開発元が出さなければ設定できない(ことになっている)ので、これはできるできないを運用判断では行えないようになっていたはずw

なので、COM+には対応してませんよ~でもいいのかもww

DCOM/COM+あたりの本を漁ればなんか情報を得られるかもしれませんが
使う予定が今後もないところなので、全然わかってないw<COM+

# re: COM featuring ローカルリソース 2007/02/24 3:32 Atata!!

Atata!!@COM総合研究所です。


> そういった限定的なマーシャリングのみを許可するプロキシを作ることはできるのだろうか。
> あるいは、IMarshalのカスタム実装が必要になるのだろうか(プロセスローカルリソースはFTMが使えるかもしれないが)。

可能です。
MIDLで[wire_marshal]属性を使用することにより、インプロセス、ローカルおよびリモート呼び出し毎に独自のマーシャリングを行うことが出来ます。
[wire_marshal]を使用する場合、プロキシ/スタブをすべて作成する必要はありません。
独自にマーシャリングしなければならない部分以外はデフォルトのマーシャリングに任せることが出来ます。
なお、[wire_marshal]を使用する際の問題点は、Effective COM に詳しく載ってますので、そちらを参照してください。
ちなみに、 Visual Studio 2005 に付属しているMIDLコンパイラでも Effective COM で言及されている問題は解決されていないようです。

Effective COM 持ってないってのは無しの方向で。


> こういったローカル/リモート透過性を持たないリソースを扱うにはCOMは適さないという結論にならないことを祈るばかりである。

ちなみに私の結論はコレです。

# re: COM featuring ローカルリソース 2007/02/24 13:10 渋木宏明(ひどり)

「データ中継」そのものが「マーシャリング」ではないような。

# re: COM featuring ローカルリソース 2007/02/24 16:29 シャノン

> なので、COM+には対応してませんよ~でもいいのかもww

COMがすべてCOM+になったわけではなく、依然として+でないCOMもDCOMもいっぱいあるから、それじゃ解決にならんと思う…。

> MIDLで[wire_marshal]属性を使用することにより、インプロセス、ローカルおよびリモート呼び出し毎に独自のマーシャリングを行うことが出来ます。

ありがとうございます。

> [wire_marshal]を使用する際の問題点

タイプライブラリとの相性が悪いんでしたっけ。

> Visual Studio 2005 に付属しているMIDLコンパイラでも Effective COM で言及されている問題は解決されていないようです。

既にCOMが過去の技術となり果てた以上、今後改善される望みは無い気がしますけどね…
ただ、タイプライブラリが完全なインターフェイスの情報を保持できないとなると、.NET から使うときに困りそう…。
タイプライブラリを提供してなくても .NET から呼び出せるならいいけど。
#cotype とか対応してよ。

> ちなみに私の結論はコレです。

えー。

> 「データ中継」そのものが「マーシャリング」ではないような。

まぁ、うん。
中継自体はRPCとかネットワークの仕事だけど、まぁいいじゃん、とか。

# re: COM featuring ローカルリソース 2007/04/26 16:33 zen

先日はお世話になりました。
IExtractImageの質問をわんくま様で
させていただいた者です。

C#でCOMを使うと、いろいろ面白くて役に立つ
ものが出来そうな気がするのですが、資料やテキストって
少ないものですね。

いろいろ情報を集めて学習しようと思います。

# re: COM featuring ローカルリソース 2007/04/26 16:40 シャノン

zenさん、いらっさいませ。

> C#でCOMを使うと、いろいろ面白くて役に立つ
> ものが出来そうな気がするのですが、資料やテキストって
> 少ないものですね。

いやー、COMと.NETはやっぱり性格が違うので、何かとうまく行かんと思いますけどね。
俺はC++/CLIを使おうと思っています。

タイトル
名前
Url
コメント