comdef.h の lstrlen が構文エラーになるときは(改)

コンパイラの出すエラーメッセージが、どこのどういう記述に起因し、どう修正すればいいのかを解読するのは、いつになっても難儀なものです。

1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\include\comdef.h(240) : error C2589: '(' : スコープ解決演算子 (::) の右側にあるトークンは使えません。
1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\include\comdef.h(240) : error C2059: 構文エラー : '::'

というメッセージを見て、いくらcomdef.h の240行を見ても

            int nLen = ::lstrlen(m_pszMsg);

とあるだけで、何が悪いのかさっぱりわかりません。

lstrlen は lstrlenW を経て wcslen に定義されているけど、何が問題なんだ?

万策尽きてプリプロセッサ出力を見たら、こんな風になってました。

            int nLen = ::(int)ATL::lstrlenW(m_pszMsg);

こりゃあかんわ。

結局、comdef.h を一連のATL/WTL ヘッダより先にインクルードすることで解決できました。
結局、comdef.h の240行を以下のように修正しました。

            int nLen = lstrlen(m_pszMsg);

教訓1:ATL/WTL は極力最後に include すべし。
教訓2:意味のわからないエラーが出たら、プリプロセッサ出力を見よ。

うーむ、やっぱりテンプレートライブラリは劇薬だ。
WinMain プログラミングに対しては、毒をもって毒を制すくらいの心持で使わないといけないらしい。

(追記)
どういうわけか、年があけてから再びコンパイルしたら件の箇所がどうしても通らなかったので修正。
去年は何で通ったんだ……?