シェルおよび Shlwapi DLL のバージョン

このセクションでは、アプリケーションが実行されているシェル DLL のバージョンを決定する方法と、特定のバージョンのアプリケーションをターゲットにする方法について説明します。

DLL のバージョン番号

シェルのドキュメントで説明されているプログラミング要素の一部を含むすべてが、Shell32.dllとShlwapi.dllの 2 つの DLL に含まれています。 継続的な機能強化により、これらの DLL のバージョンによって異なる機能が実装されます。 シェルリファレンスドキュメント全体を通して、各プログラミング要素は、サポートされている最小 DLL バージョン番号を指定します。 このバージョン番号は、特に指定がない限り、プログラミング要素がそのバージョン以降のバージョンの DLL に実装されていることを示します。 バージョン番号が指定されていない場合、プログラミング要素は DLL のすべての既存のバージョンに実装されます。

Windows XP より前は、新しいShell32.dllとShlwapi.dllバージョンが Windows インターネット エクスプローラーの新しいバージョンで提供される場合がありました。 Windows XP の時点では、これらの DLL は、Windows 自体の新しいバージョンの外部で再頒布可能ファイルとして提供されなくなりました。 次の表は、さまざまな DLL バージョンと、Microsoft Internet エクスプローラー 3.0、Windows 95、および Microsoft Windows NT 4.0 に戻って配布された方法の概要を示しています。

Shell32.dll バージョン 4.0 は、Windows 95 と Microsoft Windows NT 4.0 の元のバージョンにあります。 シェルは Internet エクスプローラー 3.0 リリースで更新されていないため、Shell32.dllにはバージョン 4.70 がありません。 Shell32.dllバージョン 4.71 と 4.72 は、対応するインターネット エクスプローラー リリースに付属していましたが、必ずしもインストールされていません (注 1 を参照)。 Microsoft Internet エクスプローラー 4.01 および Windows 98 以降のリリースでは、Shell32.dllとShlwapi.dllのバージョン番号が異なっています。 一般に、DLL のバージョン番号が異なると想定し、それぞれを個別にテストする必要があります。

Shell32.dll

バージョン 配布プラットフォーム
4.0 Windows 95 と Microsoft Windows NT 4.0
4.71 Microsoft Internet エクスプローラー 4.0。 注 1 を参照
4.72 インターネット エクスプローラー 4.01 と Windows 98。 注 1 を参照
5.0 Windows 2000 および Windows Millennium Edition (Windows Me)。 注 2 を参照してください。
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

バージョン 配布プラットフォーム
4.0 Windows 95 と Microsoft Windows NT 4.0
4.71 インターネット エクスプローラー 4.0。 注 1 を参照
4.72 インターネット エクスプローラー 4.01 と Windows 98。 注 1 を参照
4.7 インターネット エクスプローラー 3.x
5.0 Microsoft Internet エクスプローラー 5 および Windows 98 SE。 注 2 を参照してください。
5.5 Microsoft Internet エクスプローラー 5.5 および Windows Millennium Edition (Windows Me)
6.0 Windows XP と Windows Vista

注 1:インターネット エクスプローラー 4.0 または 4.01 を使用するすべてのシステムには、関連付けられたバージョンの Shlwapi.dll (それぞれ 4.71 または 4.72) がありました。 ただし、Windows 98 より前のシステムの場合、Internet エクスプローラー 4.0 と 4.01 は、統合シェルと呼ばれるもののと共にインストールすることもなくインストールすることもできます。 統合シェルと共にインターネット エクスプローラーがインストールされている場合は、関連付けられているバージョンのShell32.dll (4.71 または 4.72) もインストールされました。 統合シェルなしでインターネット エクスプローラーがインストールされた場合、Shell32.dllはバージョン 4.0 のままでした。 つまり、システムにバージョン 4.71 または 4.72 のShlwapi.dllが存在しても、Shell32.dllが同じバージョン番号を持つ保証はありません。 すべての Windows 98 システムには、バージョン 4.72 のShell32.dllがあります。

注 2:Shlwapi.dllのバージョン 5.0 はインターネット エクスプローラー 5 と共に配布され、Windows 2000 を除き、インターネット エクスプローラー 5 がインストールされているすべてのシステムで検出されました。 バージョン 5.0 のShell32.dllは、Windows 2000 および Windows Millennium Edition (Windows Me) とバージョン 5.0 のShlwapi.dllと共にネイティブに配布されました。

DllGetVersion を使用してバージョン番号を確認する

バージョン 4.71 以降、シェル DLL は DllGetVersion のエクスポートを開始しました。 この関数は、システム上に存在する DLL のバージョンを決定するために、アプリケーションによって呼び出すことができます。

注意

DLL は必ずしも DllGetVersion をエクスポートするとは限りません。 使用を試みる前に、必ずテストしてください。

Windows 2000 より前の Windows バージョンの場合、 DllGetVersion は、メジャー バージョン番号とマイナー バージョン番号、ビルド番号、プラットフォーム ID を含む DLLVERSIONINFO 構造体を返します。 Windows 2000 以降のシステムの場合、 DllGetVersion は代わりに DLLVERSIONINFO2 構造体を返す場合があります。 DLLVERSIONINFO を通じて提供される情報に加えて、DLLVERSIONINFO2には、インストールされている最新のサービス パックを識別する修正プログラム番号も用意されています。これにより、バージョン番号を比較するより堅牢な方法が提供されます。 DLLVERSIONINFO2 の最初のメンバーは DLLVERSIONINFO 構造体であるため、後の構造体は下位互換性があります。

DllGetVersion の使用

次のサンプル関数 GetVersion は、指定した DLL を読み込み、 DllGetVersion 関数の呼び出しを試みます。 成功した場合、マクロを使用して 、DLLVERSIONINFO 構造体のメジャー バージョン番号とマイナー バージョン番号を、呼び出し元のアプリケーションに返される DWORD にパックします。 DLL が DllGetVersion をエクスポートしない場合、関数は 0 を返します。 Windows 2000 以降のシステムでは、 DllGetVersionDLLVERSIONINFO2 構造体を返す可能性を処理するように関数を変更できます。 その場合は、その 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 して、Shell32.dllがバージョン 6.0 以降であるかどうかをテストする方法を示しています。

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

if(dwVer >= dwTarget)
{
    // This version of Shell32.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 を使用しているアプリケーションのターゲット バージョンを定義します。 次の表は、使用可能なバージョン番号と、各バージョンがアプリケーションに与える影響を示しています。

バージョン 説明
0x0200 アプリケーションは、Shell32.dll バージョン 4.00 以降と互換性があります。 アプリケーションでは、バージョン 4.00 以降に追加された機能を実装できません。
0x0300 アプリケーションは、バージョン 4.70 以降Shell32.dll互換性があります。 アプリケーションでは、バージョン 4.70 以降に追加された機能を実装できません。
0x0400 アプリケーションは、Shell32.dll バージョン 4.71 以降と互換性があります。 アプリケーションでは、バージョン 4.71 以降に追加された機能を実装できません。
0x0401 アプリケーションは、バージョン 4.72 以降Shell32.dll互換性があります。 アプリケーションでは、バージョン 4.72 以降に追加された機能を実装できません。
0x0500 アプリケーションは、バージョン 5.0 以降Shlwapi.dllShell32.dllと互換性があります。 アプリケーションは、バージョン 5.0 以降のShell32.dllおよびShlwapi.dll後に追加された機能を実装できません。
0x0501 アプリケーションは、バージョン 5.0 以降Shlwapi.dllShell32.dllと互換性があります。 アプリケーションは、バージョン 5.0 以降のShell32.dllおよびShlwapi.dll後に追加された機能を実装できません。
0x0600 アプリケーションは、バージョン 6.0 以降Shlwapi.dllShell32.dllと互換性があります。 アプリケーションは、バージョン 6.0 以降のShell32.dllおよびShlwapi.dll後に追加された機能を実装できません。

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

/D _WIN32_IE=0x0400

もう 1 つの方法は、シェル ヘッダー ファイルを含める前に、ソース コードに次のような行を追加することです。 目的のバージョン番号を0x0400に置き換える。

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