セッションを超えた 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 でも突っ込んでみます。