COM
COM はコンパイル時に自動的に CLSID をレジストリに登録してくれます。 この登録する内容は .rgs ファイルにレジストリスクリプトを記述することになるので、.idl の library か coclass の GUID を変更した場合には、こちらも反映させる必要があります。 …
コネクションポイントはあまり使用しない方がいいらしいです。 何でかというと、コネクションポイントを接続するために5回の往復が必要になるし、イベントを発行する際に、全てに対してイベントを送信することになるので、無駄な往復が出てしまい、効率が良…
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 でのマーシャリング うへー、ものすごい間違ってましたorz いろいろ調べてみた結果、デッドロックは一切起こってなかったです。 自分はいろいろ勘違いしていたようで、COM 側(Source って言うらしい)から Sink 側を呼び出したとき、Sink 側のメッセー…
STA(Single Thread Apartment)のスレッディングモデルで COM を生成して、何らかの処理を COM に投げた場合、その処理は即座に実行されるわけではなく、マーシャラーによってメッセージキューに溜められ、そのメッセージが処理されるのを待ちます。 普段は…
セッションを超えた Mutex の動作 NULL の DACL を入れてやればちゃんとハンドルを取得できました。 SECURITY_DESCRIPTOR sd; ::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); ::SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); S…
COM の exe サーバのスケルトンを作ると、CAtlExeModuleT<> を使ったメインクラスが作成されるんだけど、こいつがなかなか面白いことをしてくれる。 クライアント側がこの COM を生成すると、exe が起動され、このアプリは起動した状態を保ちます。 2つ目の…
2重起動を防止するために ::CreateMutex() して ::GetLastError() でどうこうする、っていうのはよくあると思うけど、FUS(Fast User Switching: Windows XP でログオフを選択したときに出てくるユーザ切り替えのこと) によってセッションを超えて起動し…