ホームに戻る 初歩のVC++Programming Tipsに戻る

初歩のVC++Programming Tips Win32SDK篇

VisualC++6.0へ移行するときの注意1(プロパティーシート関数)


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に戻る