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

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


これはどうすればいいかというと、::CreateMutex() の第2引数にある、Mutex 名の最初に "Global\\" を付けるだけ。
こうすると、セッションを超えても Mutex は共有されます。


……される、はずなんだけど。
なぜか今の環境では、まあ1つ目は当然成功するわけですが、セッションを変えて2つ目の Mutex を生成しようとしたら NULL が返されて、::GetLastError() では ERROR_ACCESS_DENIED が返ってくる。


ネットで調べてみると、適切なアクセス権が無いらしい。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnaskdr/htm/drgui49.asp

とりあえず今度 NULL の DACL でも突っ込んでみます。