読者です 読者をやめる 読者になる 読者になる

winable.h

Win32 C++

古い話だけど、思い出したので書いておこうと思う。

人様の書いた古いコードをメンテしていたら、winable.hがないと言われた。調べたところ、比較的新しいPlatform SDKや、Windows SDKにはこのヘッダは含まれていない。ただし、Visual Studio .NET 2003やVisual Studio 2005にはない。

仕方がないので、MSDN Forumsで、質問した結果が、missing winable.h。MSFT(つまり中の人)の返事によれば、

WinAble.h is no longer distributed in the Windows SDK for Vista. You should be able to use WinUser.h instead.
Oleacc.idl is also not in the Windows SDK for Vista, but oleacc.h is. Does this provide acceptable functionality?

とのこと。
で、最後の

The is no symbol specific to the Windows SDK, but you can use WINVER, defined in WinDef.h 

という返事の意味がずっとわからなかったんだけど、winable.hには、

#if WINVER < 0x0500 // these structures and functions
		    // are in NT 5.00 and above winuser.h

というコードがあり、NT5.0(XP)以降では、ほとんどの定義がwinuser.hに移動されて、winable.hはそもそもほとんど廃止寸前だったことが判明しました。
そして、winuser.hには、この修正に対応する宣言がちゃんと記述されていた。

結論から言うと、

#define WINVER 0x0500

もしくは、もっと大きな値をWINVERに設定するコードをヘッダの先頭に追加したり、あるいは、プロジェクトに設定すればいいだけでした。

そして、人のあら探しになってしまうけど、ちょっとだけググったところ、mozilla developer center beta - Windows Build Prerequisitesには、

Visual Studio Codename "Orcas" の CTP リリースである March CTP には 2 つの重要なインクルードファイルを誤った場所に配置するバグがあります。回避策として winable.h と oleacc.idl を C:\Program Files\Microsoft Visual Studio 9.0\VC\include から C:\Program Files\Microsoft SDKs\Windows\6.0\include にコピーしてください。 

とか書いてある。しかしながら、どうやら、winable.hの削除は既定路線だったことが上記のヘッダの流れからも明らか。こういうことはやるべきではないと思われる。