argius note

プログラミング関連

CreateMutexの後のGetLastError

Visual C++ (2003)での話です。


多重起動(二重起動)の抑制でよく紹介されている方法で、

CreateMutex(NULL, TRUE, "IDXXXX");
if (GetLastError() == ERROR_ALREADY_EXISTS) {
    return; // 多重起動
}
setLastError(NO_ERROR);

のようなコードが登場するんですけど、このときGetLastError()が返す値って、NO_ERRORかERROR_ALREADY_EXISTSだけであることが保証されているんでしょうか。ちょっと調べてみましたが、よく分かりませんでした。


安全策として、こうした方が良いと思うんですが、どうなんでしょう。

CreateMutex(NULL, TRUE, "IDXXXX");
if (GetLastError() == ERROR_ALREADY_EXISTS) {
    return; // 多重起動
} else if (GetLastError() != NO_ERROR) {
    return; // 多重起動とは別の予期しないエラー
}
// 要らない?→ setLastError(NO_ERROR);