プロセス
アパートメント←この壁を超えるのにプロキシスタブがいる
スレッド
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()
コネクタブルオブジェクト
→テンプレートを継承&マップで追加→コネクションポイントコンテナ
→マップで追加→コネクションポイント