LoginSignup
0
0

More than 3 years have passed since last update.

COMアパートメントの雑メモ

Posted at

プロセス
 アパートメント←この壁を超えるのにプロキシスタブがいる
  スレッド

Single はじめに生まれた
Apart ひとりにしてくれ
Both どこでもいいよ(同期できるよ)
Free 子分と別居はちょっと

STA めんどくさい処理はCOMがやるアパートメントにメッセージポンプがいる
MTA スレッドセーフに作れ
 いろいろあるけどリエントラント(再入可能)とか(目を離してもスキは作らない)

マーシャリング
・MIDL(ちょっとはやい
・タイプライブラリ(オートメーションONLY ユニバーサルマーシャラ
・カスタム(融通と効率 IMarshalと全インターフェイス

DLL クライアントと同プロセス 複数のクライアントプロセスの間でデータは共有しない
EXE クライアントと別プロセス 常にProxy-Stubがいる 複数のクライアントから接続可能

DllHost DLLサーバーにリモートアクセスできるようにするやつ(サロゲート

      UIを持つ
       ↓
コンテナ→コントロール 昔からあった
コンテナ←コントロール

A→functionA(関数ポインタF)→B
A←コールバック F()←B

※SyncじゃなくてSinkだった

A→ シンクインターフェイス ISyncを渡す →B
A←コールバック ISync.method() ←B<イベント発生

大原則
サーバがクライアントへイベントを通知する
サーバはシンクインターフェイスを通じてクライアントへイベントを通知する

わたしかた
A サーバ・コネクタブルオブジェクト サーバ側のイベントに応じてシンクインターフェイスを持つ(外部インターフェイスのリストも持つ) コネクションポイントオブジェクトも実装する(コールバックの元締め) コネクションポイントコンテナも実装する(さらなる元締め)
B クライアント・シンクオブジェクト シンクインターフェイスを使ってシンクオブジェクト・そのメソッドを実装

A→B IUnknownをわたす
B QIでIconnectionPointContainerを照会※1、Aから通知を受け取りたいシンクインターフェイスが使えるか確認
(使えるので BはAから IConnectionPoint をもらう)
B AのIConnectionPointインターフェイスのAdviseをコール、自分のISyncを渡す
  A ISyncをIUnknownとしてリストに追加
A なんかイベントがおこったので(コネクションポイントオブジェクトを見つけ、インターフェイスポインタのリストを照会し)もらったISyncをコール
B イベント発生

※1 全リストをもらう方法と個別に聞く方法がある EnumConnectionPoints(), FindConnectionPoint()

コネクタブルオブジェクト
→テンプレートを継承&マップで追加→コネクションポイントコンテナ
 →マップで追加→コネクションポイント

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0