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
-
DllGetVersion használata a verziószám meghatározásához
- DllGetVersion használata
- Projektverziók
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>