共通コントロール のバージョン
このトピックでは、使用可能なバージョンの Common Control ライブラリ (ComCtl32.dll) の一覧を示し、アプリケーションが使用しているバージョンを識別する方法と、特定のバージョンのアプリケーションを対象にする方法について説明します。
このトピックには、次のセクションが含まれています。
- 共通コントロール DLL のバージョン番号
- さまざまな共通コントロール バージョンの の 構造体のサイズ
- DllGetVersion を使用してバージョン番号を確認する
- プロジェクトのバージョン
- 関連トピック
共通コントロール DLL バージョン番号
一般的なコントロールのサポートは、すべての 32 ビットバージョンと 64 ビット バージョンの Windows が含まれる ComCtl32.dllによって提供されます。 以降の各バージョンの DLL では、以前のバージョンの機能と API がサポートされ、新しい機能が追加されます。
ComCtl32.dll のさまざまなバージョンが Internet Explorer で配布されていたため、アクティブなバージョンはオペレーティング システムに付属していたバージョンと異なる場合があります。 そのため、アプリケーションは、存在する ComCtl32.dll のバージョンを直接決定する必要があります。
共通コントロールのリファレンス ドキュメントでは、多くのプログラミング要素でサポートされる最小 DLL バージョン番号を指定しています。 このバージョン番号は、特に指定がない限り、そのバージョン以降のバージョンの DLL にプログラミング要素が実装されていることを示します。 バージョン番号が指定されていない場合、プログラミング要素は、DLL のすべての既存のバージョンに実装されます。
次の表は、さまざまな DLL バージョンと、サポートされている OS での配布方法の概要を示しています。
ComCtl32.dll
バージョン
配布プラットフォーム
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_V6_SIZE | バージョン 6.0 の の 構造のサイズ。 |
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 のバージョンを判断するアプリケーションによって呼び出すことができます。
DllGetVersionDLLVERSIONINFO2 構造体を返します。 DLLVERSIONINFOを通じて提供される情報に加えて、DLLVERSIONINFO2 には、インストールされている最新のサービス パックを識別する修正プログラム番号も用意されています。これにより、バージョン番号を比較するより堅牢な方法が提供されます。 DLLVERSIONINFO2 の最初のメンバーは DLLVERSIONINFO 構造体であるため、後の構造体は下位互換性があります。
次のサンプル関数 GetVersion
指定した DLL を読み込み、その DllGetVersion 関数を呼び出そうとします。 成功した場合、マクロを使用して、DLLVERSIONINFO 構造体のメジャー バージョン番号とマイナー バージョン番号を、呼び出し元のアプリケーションに返される DWORD にパックします。 DLL が DllGetVersion エクスポートしない場合、関数は 0 を返します。
DllGetVersion が DLLVERSIONINFO2 構造体を返す可能性を処理するように関数を変更できます。 その場合は、その DLLVERSIONINFO2 構造体の ullVersion メンバーの情報を使用して、バージョン、ビルド番号、および Service Pack のリリースを比較します。
MAKEDLLVERULL マクロを使用すると、これらの値を ullVersionの値と比較するタスクが簡略化されます。
手記
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 を使用しているアプリケーションのターゲット バージョンを定義します。 次の表に、使用可能なバージョン番号と、それぞれのアプリケーションに与える影響を示します。
バージョン | 形容 |
---|---|
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
もう 1 つの方法は、シェル ヘッダー ファイルを含める前に、ソース コードに次のような行を追加することです。 目的のバージョン番号を0x0400に置き換える。
#define _WIN32_IE 0x0400
#include <commctrl.h>
関連トピック
-
共通コントロールの について