次の方法で共有


シェルと Shlwapi DLL のバージョン

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

DLL バージョン番号

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

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

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

Shell32.dll

バージョン 配布プラットフォーム
4.0 Windows 95 および Microsoft Windows NT 4.0
4.71 Microsoft Internet Explorer 4.0。 注 1 を参照してください。
4.72 Internet Explorer 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 Internet Explorer 4.0。 注 1 を参照してください。
4.72 Internet Explorer 4.01 と Windows 98。 注 1 を参照してください。
4.7 Internet Explorer 3.x
5.0 Microsoft Internet Explorer 5 と Windows 98 SE。 注 2 を参照してください。
5.5 Microsoft Internet Explorer 5.5 と Windows Millennium Edition (Windows Me)
6.0 Windows XP と Windows Vista

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

注 2: バージョン 5.0 の Shlwapi.dll は Internet Explorer 5 と共に配布され、Windows 2000 を除き、Internet Explorer 5 がインストールされているすべてのシステムで見つかりました。 Shell32.dll のバージョン 5.0 は、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には、インストールされている最新の Service Pack を識別する修正プログラム番号も用意されています。これにより、バージョン番号を比較するより堅牢な方法が提供されます。 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 アプリケーションは、Shell32.dll バージョン 4.70 以降と互換性があります。 アプリケーションでは、バージョン 4.70 以降に追加された機能を実装できません。
0x0400 アプリケーションは、Shell32.dll バージョン 4.71 以降と互換性があります。 アプリケーションは、バージョン 4.71 以降に追加された機能を実装できません。
0x0401 アプリケーションは、Shell32.dll バージョン 4.72 以降と互換性があります。 アプリケーションは、バージョン 4.72 より後に追加された機能を実装できません。
0x0500 アプリケーションは、Shell32.dll バージョン 5.0 以降 Shlwapi.dll 互換性があります。 アプリケーションは、バージョン 5.0 の Shell32.dll および Shlwapi.dllより後に追加された機能を実装できません。
0x0501 アプリケーションは、Shell32.dll バージョン 5.0 以降 Shlwapi.dll 互換性があります。 アプリケーションは、バージョン 5.0 の Shell32.dll および Shlwapi.dllより後に追加された機能を実装できません。
0x0600 アプリケーションは、Shell32.dll バージョン 6.0 以降 Shlwapi.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>