FlashWindow()関数がWin2Kから変わっています。
10.24 1997Version 1.1 Beta7の壊れた文字列をタイトルとしてキープしようとするバグに関して。
と書いたところ、Daisuke Araiさんから解説を頂きました。
CString s; LPCTSTR p = s.IsEmpty() ? 0 : s;という式で、p に値ゼロが入ると思いきや、0 を評価するところでなぜか CString がコンストラクトされて、値は 0 にならない。この場合呼ばれるコンストラクタは、CString::CString(TCHAR ch, int nRepeat = 1)三項演算子を使わなければ、この問題はおきない。if (s.IsEmpty()) p = 0; else p = s;どうしてか、誰か教えて下さい。
Date: Mon, 11 Nov 1996 02:18:41 +0900 From: Daisuke Arai <arapyon@raiden.com>[中略]
? 演算子は、返り値の二つの型は同じである必要がある。この場合の、0 : s について考えると、
s.IsEmpty() ? LPCSTR(0) : LPCSTR(s)か、s.IsEmpty() ? CString(0) : sのどちらかになると思いますが、上のケースでは、両方ともキャストが必要ですので、コンパイラがキャストをできない。下のケースでは、キャストするのは、0 だけでよいので、コンパイラが自動的にキャストできる。という理由で、CString::CString(TCHAR ch, int nRepeat = 1) が呼ばれてしまうのではないでしょうか?
[後略]
ということで納得しました。
s.IsEmpty() ? LPCSTR(0) : LPCTSTR(s);あるいは
s.IsEmpty() ? 0 : LPCTSTR(s);で、望んだ結果が得られました (値が LPCTSTR(0) になった)。