ホームに戻る 初歩のVC++Programming Tipsに戻る
VisualC++6.0では、IE4.0コモンコントロールや壁紙付きのウイザードプロパティを作るためのWizard97と呼ばれるプロパティシートが正式にサポートされたSDKが同梱されています。Wizard97とはPropertySheet関数を拡張して、任意のビットマップをウイザードに張り付けることができるようにしたものです。
この「拡張」でIE4以前のcomctl32.dllとの互換性がなくなりました。具体的にどのような問題が起こるかというと、「IE4が入っていないWindowsでは動作しなくなる」ということです。筆者も最初はIE4コモンコントロールを使わなければ問題は起こらないだろうと考えていましたが、Wizard97の拡張はPropertySheet関数が引数とする構造体PROPSHEETHEADERに新たなメンバを追加するという大胆な方法で行われているので、VisualC++5.0からそのまま移行したプロジェクトでビルドしたアプリは、IE4の入っていないWindowsではPropertySheet関数の実行に失敗してしまいます。
Wizard97の拡張部分はプリプロセッサ命令 #if で拡張部分をコンパイルの対象から外すことができます。実際の宣言部は次のようになっています。
typedef struct _PROPSHEETHEADERA {
(中略)
#if (_WIN32_IE >= 0x0400)
union {
HBITMAP hbmWatermark;
LPCSTR pszbmWatermark;
} DUMMYUNIONNAME4;
HPALETTE hplWatermark;
union {
BITMAP hbmHeader; // Header bitmap shares the palette with watermark
LPCSTR pszbmHeader;
} DUMMYUNIONNAME5;
#endif
};
_WIN32_IEマクロが定義されていない場合は、ヘッダファイル内の
#ifndef _WIN32_IE
#define _WIN32_IE 0x0400
で、デフォルトとして定義されます。これによって、プログラマが特に意識しない場合はIE4がインストールされていないと動かないアプリが作られてしまうわけです。
| 対策 |
ソースコードに
#define _WIN32_IE 0x0200
と定義しておくか、コンパイルスイッチの
/D _WIN32_IE=0x0200
を追加すれば、どのバージョンのcomctl32.dllでも動作するようになるはずです。
_WIN32_IEマクロで定義する数値と、対応するcomctl32.dllのバージョンは以下のようになっています。
| 定義する数値 | 対応するcomctl32.dllのバージョン | 対応するcomctr32.dllがついてくる環境 |
| 0x0200 | 4.00以降 | プレーンなWin95/NT4.0 |
| 0x0300 | 4.70以降 | IE3.x |
| 0x0400 | 7.71以降 | IE4.0 |
| 0x0401 | 4.72以降 | IE4.01 |
参考文献
「MSDNライブラリ VisualStudio6.0」 Shell and Common
Controls; Platform SDK - Common Controls -
copyright (c) 1998-2000 by T-Matsuo
ホームに戻る 初歩のVC++Programming Tipsに戻る