共通コントロールのバージョン

このトピックでは、共通コントロール ライブラリ (ComCtl32.dll) の使用可能なバージョンの一覧を示すとともに、アプリケーションで使用しているバージョンを特定する方法と、アプリケーションで特定のバージョンをターゲット設定する方法について説明します。

このトピックは、次のセクションで構成されています。

共通コントロール DLL のバージョン番号

共通コントロールのサポートは、32 ビットと 64 ビットのすべてのバージョンの Windows に含まれている ComCtl32.dll によって提供されます。 各後継バージョンの DLL では、以前のバージョンの機能と API がサポートされ、新しい機能が追加されます。

さまざまなバージョンの ComCtl32.dll が Internet Explorer に付属して配布されたため、アクティブなバージョンは、オペレーティング システムに付属していたバージョンとは異なる場合があります。 そのため、アプリケーションで直接、存在する ComCtl32.dllの バージョンを判別する必要があります。

共通コントロールのリファレンス ドキュメントでは、多くのプログラミング要素で、サポートされる最小 DLL バージョン番号を示しています。 このバージョン番号は、特に指定がない限り、そのバージョン以降の DLL に当該のプログラミング要素が実装されていることを示します。 バージョン番号が示されていない場合、そのプログラミング要素は、DLL のすべての既存のバージョンで実装されています。

次の表に、さまざまな DLL バージョンと、サポートされている OS での配布方法の概要を示します。

ComCtl32.dll

バージョン

Distribution Platform

5.81

Microsoft Internet Explorer 5.01、 Microsoft Internet Explorer 5.5、Microsoft Internet Explorer 6

5.82

Windows Server 2003、Windows Vista、Windows Server 2008、Windows 7

6.0

Windows Server 2003

6.10

Windows Vista、Windows Server 2008、Windows 7

 

さまざまな共通コントロール バージョンの構造体のサイズ

共通コントロールに対する継続的な機能強化の結果、多くの構造体を拡張する必要が生じました。 このため、Commctrl.h の異なるバージョン間で構造体のサイズが変更されています。 共通コントロールの構造体のほとんどは、構造体サイズをパラメーターの 1 つとして受け取るため、サイズが認識されない場合、メッセージまたは関数が失敗する可能性があります。 これを修正するために、異なるバージョンの ComCtl32.dll をターゲット設定するうえで役立つ構造体サイズ定数が定義されています。 次の一覧に、構造体のサイズ定数を定義しています。

構造体サイズ定数 定義
HDITEM_V1_SIZE バージョン 4.0 の HDITEM 構造体のサイズ。
IMAGELISTDRAWPARAMS_V3_SIZE バージョン 5.9 の IMAGELISTDRAWPARAMS 構造体のサイズ。
LVCOLUMN_V1_SIZE バージョン 4.0 の LVCOLUMN 構造体のサイズ。
LVGROUP_V5_SIZE バージョン 6.0 の LVGROUP 構造体のサイズ。
LVHITTESTINFO_V1_SIZE バージョン 4.0 の LVHITTESTINFO 構造体のサイズ。
LVITEM_V1_SIZE バージョン 4.0 の LVITEM 構造体のサイズ。
LVITEM_V5_SIZE バージョン 6.0 の LVITEM 構造体のサイズ。
LVTILEINFO_V5_SIZE バージョン 6.0 の LVTILEINFO 構造体のサイズ。
MCHITTESTINFO_V1_SIZE バージョン 4.0 の MCHITTESTINFO 構造体のサイズ。
NMLVCUSTOMDRAW_V3_SIZE バージョン 4.7 の NMLVCUSTOMDRAW 構造体のサイズ。
NMTTDISPINFO_V1_SIZE バージョン 4.0 の NMTTDISPINFO 構造体のサイズ。
NMTVCUSTOMDRAW_V3_SIZE バージョン 4.7 の NMTVCUSTOMDRAW 構造体のサイズ。
PROPSHEETHEADER_V1_SIZE バージョン 4.0 の PROPSHEETHEADER 構造体のサイズ。
PROPSHEETPAGE_V1_SIZE バージョン 4.0 の PROPSHEETPAGE 構造体のサイズ。
REBARBANDINFO_V3_SIZE バージョン 4.7 の REBARBANDINFO 構造体のサイズ。
REBARBANDINFO_V6_SIZE バージョン 6.0 の REBARBANDINFO 構造体のサイズ。
TTTOOLINFO_V1_SIZE バージョン 4.0 の TOOLINFO 構造体のサイズ。
TTTOOLINFO_V2_SIZE バージョン 4.7 の TOOLINFO 構造体のサイズ。
TTTOOLINFO_V3_SIZE バージョン 6.0 の TOOLINFO 構造体のサイズ。
TVINSERTSTRUCT_V1_SIZE バージョン 4.0 の TVINSERTSTRUCT 構造体のサイズ。

 

DllGetVersion を使用したバージョン番号の判別

アプリケーションから DllGetVersion 関数を呼び出して、システム上にどの DLL バージョンが存在するのかを判別できます。

DllGetVersion は、DLLVERSIONINFO2 構造体を返します。 DLLVERSIONINFO で提供される情報に加えて、DLLVERSIONINFO2 では、インストールされている最新のサービス パックを識別する修正プログラム番号も提供します。これは、バージョン番号を比較する、より確実な手段となります。 DLLVERSIONINFO2 の 1 番目のメンバーは DLLVERSIONINFO 構造体であるため、それ以降の構造体には下位互換性があります。

次のサンプル関数 GetVersion は、指定された DLL を読み込み、その DllGetVersion 関数の呼び出しを試みます。 呼び出しが成功した場合、マクロを使用して、DLLVERSIONINFO 構造体から取得したメジャー バージョン番号とマイナー バージョン番号を DWORD にパックします。これが呼び出し元のアプリケーションに返されます。 DLL から DllGetVersion がエクスポートされない場合は、この関数はゼロを返します。 DllGetVersionDLLVERSIONINFO2 構造体を返す可能性に対応するために、この関数を変更することができます。 この場合、その DLLVERSIONINFO2 構造体の ullVersionメンバーに含まれている情報を使用して、バージョン、ビルド番号、サービス パックのリリースを比較します。 MAKEDLLVERULL マクロにより、これらの値を ullVersion に含まれる値と比較するタスクが簡素化されます。

Note

LoadLibrary を正しく使用しないと、セキュリティ上のリスクが生じる可能性があります。 さまざまなバージョンの Windows に付属する DLL を正しく読み込む方法については、LoadLibrary のドキュメントを参照してください。

 

#include "stdafx.h"
#include "windows.h"
#include "windef.h"
#include "winbase.h"
#include "shlwapi.h"

#define PACKVERSION(major,minor) MAKELONG(minor,major)

DWORD GetVersion(LPCTSTR lpszDllName)
{
    HINSTANCE hinstDll;
    DWORD dwVersion = 0;

    // For security purposes, LoadLibrary should be provided with a fully qualified 
    // path to the DLL. The lpszDllName variable should be tested to ensure that it 
    // is a fully qualified path before it is used. 
    hinstDll = LoadLibrary(lpszDllName);
    
    if(hinstDll)
    {
        DLLGETVERSIONPROC pDllGetVersion;
        pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hinstDll, "DllGetVersion");

        // Because some DLLs might not implement this function, you must test for 
        // it explicitly. Depending on the particular DLL, the lack of a DllGetVersion 
        // function can be a useful indicator of the version. 

        if(pDllGetVersion)
        {
            DLLVERSIONINFO dvi;
            HRESULT hr;

            ZeroMemory(&dvi, sizeof(dvi));
            dvi.info1.cbSize = sizeof(dvi);

            hr = (*pDllGetVersion)(&dvi);

            if(SUCCEEDED(hr))
            {
               dwVersion = PACKVERSION(dvi.info1.dwMajorVersion, dvi.info1.dwMinorVersion);
            }
        }
        FreeLibrary(hinstDll);
    }
    return dwVersion;
}

次のコード例は、GetVersion を使用して、ComCtl32.dll がバージョン 6.0 以降かどうかをテストする方法を示しています。

LPCTSTR lpszDllName = L"C:\\Windows\\System32\\ComCtl32.dll";
DWORD dwVer = GetVersion(lpszDllName);
DWORD dwTarget = PACKVERSION(6,0);

if(dwVer >= dwTarget)
{
    // This version of ComCtl32.dll is version 6.0 or later.
}
else
{
    // Proceed knowing that version 6.0 or later additions are not available.
    // Use an alternate approach for older the DLL version.
}

プロジェクト バージョン

アプリケーションで、ターゲット設定したさまざまなバージョンの .dll ファイルとの互換性を確保するために、ヘッダー ファイルにバージョン マクロが存在しています。 これらのマクロは、さまざまなバージョンの DLL 用に特定の定義を指定、除外、または再定義するために使用されます。 これらのマクロの詳細な説明については、「Windows ヘッダーの使用」を参照してください。

たとえば、マクロ名 _WIN32_IE は通常、比較的古いヘッダーで使用されています。 マクロは 16 進数として定義する必要があります。 このバージョン番号は、DLL を使用しているアプリケーションのターゲット バージョンを定義します。 次の表に、使用可能なバージョン番号と、それぞれのバージョンがアプリケーションに与える影響を示します。

Version 説明
0x0300 このアプリケーションは、ComCtl32.dll バージョン 4.70 以降と互換性があります。 このアプリケーションでは、バージョン 4.70 以降に追加された機能を実装できません。
0x0400 このアプリケーションは、ComCtl32.dll バージョン 4.71 以降と互換性があります。 このアプリケーションでは、バージョン 4.71 以降に追加された機能を実装できません。
0x0401 このアプリケーションは、ComCtl32.dll バージョン 4.72 以降と互換性があります。 このアプリケーションでは、バージョン 4.72 以降に追加された機能を実装できません。
0x0500 このアプリケーションは、ComCtl32.dll バージョン 5.80 以降と互換性があります。 このアプリケーションでは、バージョン 5.80 以降に追加された機能を実装できません。
0x0501 このアプリケーションは、ComCtl32.dll バージョン 5.81 以降と互換性があります。 このアプリケーションでは、バージョン 5.81 以降に追加された機能を実装できません。
0x0600 このアプリケーションは、ComCtl32.dll バージョン 6.0 以降と互換性があります。 このアプリケーションでは、バージョン 6.0 以降に追加された機能を実装できません。

 

プロジェクトで _WIN32_IE マクロを定義しない場合、自動的に 0x0500 として定義されます。 別の値を定義するには、make ファイルのコンパイラ ディレクティブに次のコードを追加します。0x0400 を目的のバージョン番号に置き換えてください。

/D _WIN32_IE=0x0400

別の方法としては、ソース コード内で、シェル ヘッダー ファイルを含める前に次のような行を追加します。 0x0400 を目的のバージョン番号に置き換えてください。

#define _WIN32_IE 0x0400
#include <commctrl.h>

共通コントロールについて