1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class CSessionGlobalBool { public: explicit CSessionGlobalBool(LPCSTR pName) { m_pName = (LPSTR)LocalAlloc(LMEM_FIXED, lstrlenA(pName)+sizeof(char)); lstrcpy(m_pName, pName); } ~CSessionGlobalBool(){ LocalFree(m_pName); } operator bool() { return get(); } operator =(const bool b) { HANDLE h = CreateEvent(NULL, TRUE, FALSE, m_pName); if(b) SetEvent(h); else ResetEvent(h); } operator =(const CSessionGlobalBool& sgb) { *this = sgb.get(); } private: bool get() const { HANDLE h = CreateEvent(NULL, TRUE, FALSE, m_pName); return WaitForSingleObject(h, 0) == WAIT_OBJECT_0; } LPSTR m_pName; }; |
イベントオブジェクトを使った。グローバルといってもセッション(ユーザのログイン)でのみ一位性を保持する。読み出した値は一時的なもので次の瞬間には変わってることもありえる。同じオブジェクトの==の比較がfalseになることもある。
また、ある名前のオブジェクトを使っているプロセスが全部死んだからfalseになる。というか消える。状態を維持するには最低1つのアプリがこの変数を持っていなければならない。
実際の使い道はほとんどない。