Megosztás a következőn keresztül:


Shell- és Shlwapi DLL-verziók

Ez a szakasz azt ismerteti, hogyan állapítható meg, hogy az alkalmazás melyik Shell-DLL-verzión fut, és hogyan célozhatja meg az alkalmazást egy adott verzióra.

DLL-verziószámok

A Shell dokumentációjában tárgyalt programozási elemek mindegyike két DLL-ben található: Shell32.dll és Shlwapi.dll. A folyamatos fejlesztések miatt ezeknek a DLL-eknek a különböző verziói különböző funkciókat implementálnak. A Shell referenciadokumentációjában minden programozási elem meghatároz egy minimálisan támogatott DLL-verziószámot. Ez a verziószám azt jelzi, hogy a programozási elem az adott verzióban és a DLL későbbi verzióiban van implementálva, kivéve, ha másként van megadva. Ha nincs megadva verziószám, a programozási elem a DLL összes meglévő verziójában implementálva lesz.

A Windows XP előtt az új Shell32.dll és Shlwapi.dll verziók néha a Windows Internet Explorer új verzióival lettek ellátva. A Windows XP-hez hasonlóan ezek a DLL-ek már nem voltak terjeszthető fájlokként a Windows új verzióin kívül. Az alábbi táblázat ismerteti a különböző DLL-verziókat és azok terjesztésének módját a Microsoft Internet Explorer 3.0, a Windows 95 és a Microsoft Windows NT 4.0 rendszerben.

Shell32.dll 4.0-s verzió a Windows 95 és a Microsoft Windows NT 4.0 eredeti verzióiban található. A Rendszerhéj nem frissült az Internet Explorer 3.0 kiadással, így Shell32.dll nem rendelkezik 4.70-es verzióval. Shell32.dll 4.71-es és 4.72-es verziót a megfelelő Internet Explorer-kiadásokkal szállították, de nem feltétlenül lettek telepítve (lásd az 1. megjegyzést). A Microsoft Internet Explorer 4.01-et és Windows 98-at követő kiadások esetében a Shell32.dll és Shlwapi.dll verziószámai eltérnek. Általában azt kell feltételezni, hogy a DLL-ek különböző verziószámokkal rendelkeznek, és mindegyiket külön-külön tesztelik.

Shell32.dll

Verzió Terjesztési platform
4.0 Windows 95 és Microsoft Windows NT 4.0
4.71 Microsoft Internet Explorer 4.0. Lásd az 1. megjegyzést.
4.72 Internet Explorer 4.01 és Windows 98. Lásd az 1. megjegyzést.
5.0 Windows 2000 és Windows Millennium Edition (Windows Me). Lásd a 2. megjegyzést.
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

Verzió Terjesztési platform
4.0 Windows 95 és Microsoft Windows NT 4.0
4.71 Internet Explorer 4.0. Lásd az 1. megjegyzést.
4.72 Internet Explorer 4.01 és Windows 98. Lásd az 1. megjegyzést.
4.7 Internet Explorer 3.x
5.0 Microsoft Internet Explorer 5 és Windows 98 SE. Lásd a 2. megjegyzést.
5.5 Microsoft Internet Explorer 5.5 és Windows Millennium Edition (Windows Me)
6.0 Windows XP és Windows Vista

1. megjegyzés: Az Internet Explorer 4.0-s vagy 4.01-es verziójával rendelkező összes rendszer a Shlwapi.dll társított verzióját (4.71 vagy 4.72) használja. A Windows 98 előtti rendszerek esetében azonban az Internet Explorer 4.0 és 4.01 telepíthető az integrált Shell. Ha az Internet Explorert az integrált Shellrel telepítették, a Shell32.dll társított verziója (4.71 vagy 4.72) is telepítve lett. Ha az Internet Explorer az integrált Shell nélkül lett telepítve, Shell32.dll a 4.0-s verzió maradt. Más szóval a Shlwapi.dll 4.71-es vagy 4.72-es verziójának jelenléte nem garantálja, hogy Shell32.dll azonos verziószámmal rendelkezik. Minden Windows 98-rendszerben a Shell32.dll4.72-es verziója van.

2. megjegyzés: Shlwapi.dll 5.0-s verziója az Internet Explorer 5-ös verziójával lett elosztva, és minden olyan rendszeren megtalálható, amelyre az Internet Explorer 5 telepítve volt, a Windows 2000 kivételével. A Shell32.dll 5.0-s verziója natív módon lett elosztva a Windows 2000 és a Windows Millennium Edition (Windows Me), valamint a Shlwapi.dll5.0-s verziójával.

A DllGetVersion használata a verziószám meghatározásához

A 4.71-es verziótól kezdve a Shell DLL-ek többek között elkezdték exportálni DllGetVersion. Ezt a függvényt egy alkalmazás meghívhatja annak megállapításához, hogy melyik DLL-verzió található a rendszeren.

Jegyzet

A DLL-ek nem feltétlenül exportálják DllGetVersion. A használat előtt mindig tesztelje.

A Windows 2000-nél korábbi Windows-verziók esetében DllGetVersion egy DLLVERSIONINFO struktúrát ad vissza, amely tartalmazza a fő- és alverziószámokat, a buildszámot és a platformazonosítót. Windows 2000 és újabb rendszerek esetén előfordulhat, hogy DllGetVersion inkább egy DLLVERSIONINFO2 struktúrát ad vissza. A DLLVERSIONINFO által biztosított információkon kívül DLLVERSIONINFO2a legújabb telepített szervizcsomagot azonosító gyorsjavítási számot is biztosítja, amely robusztusabb módot kínál a verziószámok összehasonlítására. Mivel a DLLVERSIONINFO2 első tagja egy DLLVERSIONINFO struktúra, a későbbi struktúra visszamenőlegesen kompatibilis.

A DllGetVersion használata

Az alábbi mintafüggvény egy megadott DLL-t tölt be GetVersion, és megpróbálja meghívni a DllGetVersion függvényt. Ha sikeres, makróval csomagolja be a fő- és alverziószámokat a DLLVERSIONINFO struktúrából egy DWORD, amelyet a rendszer visszaad a hívó alkalmazásnak. Ha a DLL nem exportálja DllGetVersion, a függvény nullát ad vissza. Windows 2000 és újabb rendszerek esetén módosíthatja a függvényt, hogy kezelni tudja annak lehetőségét, hogy DllGetVersionDLLVERSIONINFO2 struktúrát ad vissza. Ha igen, használja az adott DLLVERSIONINFO2 szerkezet ullVersion tagjának adatait a verziók, buildszámok és szervizcsomagok kiadásainak összehasonlításához. A MAKEDLLVERULL makró egyszerűbbé teszi ezeknek az értékeknek az összehasonlítását az ullVersion.

Jegyzet

A LoadLibrary helytelen használata biztonsági kockázatot jelenthet. A DLL-ek különböző Windows-verziókkal való helyes betöltéséről a LoadLibrary dokumentációjában olvashat.

#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;
}

Az alábbi példakód bemutatja, hogyan tesztelheti GetVersion, hogy Shell32.dll 6.0-s vagy újabb verzió-e.

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.
}

Projektverziók

Annak érdekében, hogy az alkalmazás kompatibilis legyen egy .dll-fájl különböző célzott verzióival, a fejlécfájlokban verziómakrók találhatók. Ezek a makrók a DLL különböző verzióinak bizonyos definícióinak definiálására, kizárására vagy újradefinitálására szolgálnak. A makrók részletes leírását a A Windows-fejlécek című témakörben talál.

A _WIN32_IE makrónév például gyakran megtalálható a régebbi fejlécekben. A makró hexadecimális számként való definiálásáért Ön a felelős. Ez a verziószám határozza meg a DLL-t használó alkalmazás célverzióját. Az alábbi táblázat az elérhető verziószámokat és az egyes alkalmazásokra gyakorolt hatást mutatja be.

Verzió Leírás
0x0200 Az alkalmazás kompatibilis Shell32.dll 4.00-s és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.00-s verzió után hozzáadott funkciókat.
0x0300 Az alkalmazás kompatibilis Shell32.dll 4.70-es és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.70-es verzió után hozzáadott funkciókat.
0x0400 Az alkalmazás kompatibilis Shell32.dll 4.71-es és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.71-es verzió után hozzáadott funkciókat.
0x0401 Az alkalmazás kompatibilis Shell32.dll 4.72-es és újabb verziójával. Az alkalmazás nem tudja implementálni a 4.72-es verzió után hozzáadott funkciókat.
0x0500 Az alkalmazás kompatibilis Shell32.dll és Shlwapi.dll 5.0-s és újabb verziójával. Az alkalmazás nem tudja implementálni a Shell32.dll és Shlwapi.dll5.0-s verziója után hozzáadott funkciókat.
0x0501 Az alkalmazás kompatibilis Shell32.dll és Shlwapi.dll 5.0-s és újabb verziójával. Az alkalmazás nem tudja implementálni a Shell32.dll és Shlwapi.dll5.0-s verziója után hozzáadott funkciókat.
0x0600 Az alkalmazás kompatibilis Shell32.dll és Shlwapi.dll 6.0-s és újabb verziójával. Az alkalmazás nem tudja implementálni a Shell32.dll és Shlwapi.dll6.0-s verziója után hozzáadott funkciókat.

Ha nem definiálja a _WIN32_IE makrót a projektben, az automatikusan 0x0500 ként lesz definiálva. Egy másik érték meghatározásához hozzáadhatja a következőt a fordítási irányelvekhez a fájlban; helyettesítse a kívánt verziószámot a 0x0400.

/D _WIN32_IE=0x0400

Egy másik módszer a következőhöz hasonló sor hozzáadása a forráskódban, mielőtt belefoglalja a Shell-fejlécfájlokat. Cserélje le a kívánt verziószámot a 0x0400.

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