COM

レジストリスクリプトの罠

COM はコンパイル時に自動的に CLSID をレジストリに登録してくれます。 この登録する内容は .rgs ファイルにレジストリスクリプトを記述することになるので、.idl の library か coclass の GUID を変更した場合には、こちらも反映させる必要があります。 …

コネクションポイントはあまり使うべきではない

コネクションポイントはあまり使用しない方がいいらしいです。 何でかというと、コネクションポイントを接続するために5回の往復が必要になるし、イベントを発行する際に、全てに対してイベントを送信することになるので、無駄な往復が出てしまい、効率が良…

CAtlExeModuleT<> を使用したプロジェクトでの初期化

VS2005 で COM の exe サーバのプロジェクトを作ると、 class CHogeModule : public CAtlExeModuleT< CHogeModule > { public : DECLARE_LIBID(LIBID_HogeLib) DECLARE_REGISTRY_APPID_RESOURCEID(IDR_HOGE, "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}") }; C…

STA でのマーシャリング(2)

STA でのマーシャリング うへー、ものすごい間違ってましたorz いろいろ調べてみた結果、デッドロックは一切起こってなかったです。 自分はいろいろ勘違いしていたようで、COM 側(Source って言うらしい)から Sink 側を呼び出したとき、Sink 側のメッセー…

STA でのマーシャリング

STA(Single Thread Apartment)のスレッディングモデルで COM を生成して、何らかの処理を COM に投げた場合、その処理は即座に実行されるわけではなく、マーシャラーによってメッセージキューに溜められ、そのメッセージが処理されるのを待ちます。 普段は…

セッションを超えた Mutex の動作(2)

セッションを超えた Mutex の動作 NULL の DACL を入れてやればちゃんとハンドルを取得できました。 SECURITY_DESCRIPTOR sd; ::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); ::SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); S…

COM の親切な対応

COM の exe サーバのスケルトンを作ると、CAtlExeModuleT<> を使ったメインクラスが作成されるんだけど、こいつがなかなか面白いことをしてくれる。 クライアント側がこの COM を生成すると、exe が起動され、このアプリは起動した状態を保ちます。 2つ目の…

セッションを超えた Mutex の動作

2重起動を防止するために ::CreateMutex() して ::GetLastError() でどうこうする、っていうのはよくあると思うけど、FUS(Fast User Switching: Windows XP でログオフを選択したときに出てくるユーザ切り替えのこと) によってセッションを超えて起動し…