Windows 7非対応

OSが変わると、動かなくなるアプリケーション・ソフトがある。
動作確認ができていないので動かないとするケースもある。
本当に動かないケースもある。
従来のOSでは未定義だった領域が使われるようになったときに、こうした問題が発生しやすい。
例を示す。
ダイアログにフォーカスが当たり、かつ選択されているかを判定するために
以下のようなif文を書いた。


if((ODS_FOCUS | ODS_SELECTED) == lpDIS->itemState){


左辺はOSで定義されているフラグビットで、右辺は状態である。
32ビットOSではこれで動いたのだが、64ビットOSになったら、
右辺の未定義ビットが使われるようになって、このif文は常に不成立になった。
元はと言えば、if文の書き方が悪く、以下のように各々のビットを判定した上で、andを取らなければ
いけないのだが、上のような書き方にしておけば、評価が一回で済むということで、横着をしたら
64ビットに拡張されて、コケたということである。


if((ODS_FOCUS & lpDIS->itemState) && (ODS_SELECTED & lpDIS->itemState) ){


パラメータから下位16ビットを取り出すために、


LOWORD(wParam)


というのが用意されているのだが、上位が使われていないだろうという思い込みと、
従来プログラムの延長で、いきなりパラメータを評価していたグラフィックカードのドライバが、
初期のWindows時代にあった。
これも、同様な過ちである。