Verze shellu a knihovny DLL Shlwapi
Tato část popisuje, jak určit, na které verzi knihoven DLL prostředí je vaše aplikace spuštěná, a jak cílit na vaši aplikaci pro konkrétní verzi.
Čísla verzí knihovny DLL
Všechny kromě několika programovacích prvků probíraných v dokumentaci prostředí jsou obsaženy ve dvou knihovnách DLL: Shell32.dll a Shlwapi.dll. Vzhledem k probíhajícím vylepšením implementují různé verze těchto knihoven DLL různé funkce. V referenční dokumentaci prostředí určuje každý programovací prvek minimální podporované číslo verze knihovny DLL. Toto číslo verze označuje, že programovací prvek je implementován v této verzi a následných verzích knihovny DLL, pokud není zadán jinak. Pokud není zadáno žádné číslo verze, programovací prvek je implementován ve všech existujících verzích knihovny DLL.
V systému Windows XP byly někdy k dispozici nové verze Shell32.dll a Shlwapi.dll s novými verzemi aplikace Windows Internet Explorer. V systému Windows XP již tyto knihovny DLL nebyly poskytovány jako distribuovatelné soubory mimo nové verze samotných Windows. Následující tabulka popisuje různé verze knihovny DLL a způsob jejich distribuce dat zpět do aplikace Microsoft Internet Explorer 3.0, Windows 95 a Microsoft Windows NT 4.0.
Shell32.dll verze 4.0 se nachází v původních verzích systému Windows 95 a Microsoft Windows NT 4.0. Prostředí nebylo aktualizováno verzí aplikace Internet Explorer 3.0, takže Shell32.dll nemá verzi 4.70. Shell32.dll verze 4.71 a 4.72 byly dodány s odpovídajícími verzemi aplikace Internet Explorer, ale nebyly nutně nainstalovány (viz poznámka 1). Čísla verzí pro Shell32.dll a Shlwapi.dll se liší pro vydání následujících v aplikaci Microsoft Internet Explorer 4.01 a Windows 98. Obecně byste měli předpokládat, že knihovny DLL mají různá čísla verzí a testují je zvlášť.
Shell32.dll
Verze | Distribuční platforma |
---|---|
4.0 | Windows 95 a Microsoft Windows NT 4.0 |
4.71 | Microsoft Internet Explorer 4.0. Viz poznámka 1. |
4.72 | Internet Explorer 4.01 a Windows 98. Viz poznámka 1. |
5.0 | Windows 2000 a Windows Millennium Edition (Windows Me). Viz poznámka 2. |
6.0 | Windows XP |
6.0.1 | Windows Vista |
6.1 | Windows 7 |
Shlwapi.dll
Verze | Distribuční platforma |
---|---|
4.0 | Windows 95 a Microsoft Windows NT 4.0 |
4.71 | Internet Explorer 4.0. Viz poznámka 1. |
4.72 | Internet Explorer 4.01 a Windows 98. Viz poznámka 1. |
4.7 | Internet Explorer 3.x |
5.0 | Microsoft Internet Explorer 5 a Windows 98 SE. Viz poznámka 2. |
5.5 | Microsoft Internet Explorer 5.5 a Windows Millennium Edition (Windows Me) |
6.0 | Windows XP a Windows Vista |
Poznámka 1: všechny systémy s Internet Explorerem 4.0 nebo 4.01 měly přidruženou verzi Shlwapi.dll (4.71 nebo 4.72). Pro systémy starší než Windows 98, Internet Explorer 4.0 a 4.01 lze nainstalovat s nebo bez toho, co bylo známo jako integrované shell. Pokud byla aplikace Internet Explorer nainstalována s integrovaným prostředím, byla nainstalována také přidružená verze Shell32.dll (4.71 nebo 4.72). Pokud byla aplikace Internet Explorer nainstalována bez integrovaného prostředí, Shell32.dll zůstala ve verzi 4.0. Jinými slovy, přítomnost verze 4.71 nebo 4.72 Shlwapi.dll v systému nezaručuje, že Shell32.dll má stejné číslo verze. Všechny systémy Windows 98 mají verzi 4.72 Shell32.dll.
Poznámka 2: verze 5.0 Shlwapi.dll byla distribuována s aplikací Internet Explorer 5 a byla nalezena ve všech systémech, na kterých byla nainstalována aplikace Internet Explorer 5 s výjimkou systému Windows 2000. Verze 5.0 Shell32.dll byla nativně distribuována se systémem Windows 2000 a Windows Millennium Edition (Windows Me) společně s verzí 5.0 Shlwapi.dll.
Určení čísla verze pomocí knihovny DllGetVersion
Počínaje verzí 4.71 začaly knihovny DLL shell mimo jiné exportovat DllGetVersion. Tuto funkci může volat aplikace, která určí, která verze knihovny DLL je v systému k dispozici.
Poznámka
Knihovny DLL nemusí nutně exportovat DllGetVersion. Před pokusem o jeho použití vždy testujte.
U verzí systému Windows starších než Windows 2000 vrátí DllGetVersion strukturu DLLVERSION INFO, která obsahuje čísla hlavních a podverzí, číslo buildu a ID platformy. V systémech Windows 2000 a novějších může DllGetVersion místo toho vrátit strukturu DLLVERSIONINFO2. Kromě informací poskytovaných prostřednictvím DLLVERSIONINFO, DLLVERSIONINFO2také poskytuje číslo opravy hotfix, které identifikuje nejnovější nainstalovanou aktualizaci Service Pack, která poskytuje robustnější způsob porovnání čísel verzí. Protože první člen DLLVERSIONINFO2 je DLLVERSIONINFO struktury, pozdější struktura je zpětně kompatibilní.
Použití knihovny DllGetVersion
Následující ukázková funkce GetVersion
načte zadanou knihovnu DLL a pokusí se volat její funkci DllGetVersion. V případě úspěchu použije makro k zabalení čísel hlavních a podverzí z DLLVERSIONINFO struktury do DWORD, který se vrátí volající aplikaci. Pokud knihovna DLL neexportuje DllGetVersion, vrátí funkce nulu. V systémech Windows 2000 a novějších můžete upravit funkci tak, aby zvládla možnost, že DllGetVersion vrátí DLLVERSIONINFO2 strukturu. Pokud ano, použijte informace v této DLLVERSIONINFO2 struktury ullVersion člen k porovnání verzí, čísel buildů a verzí aktualizace Service Pack. Makro MAKEDLLVERULL zjednodušuje porovnání těchto hodnot s hodnotami v ullVersion.
Poznámka
Použití LoadLibrary nesprávně může představovat bezpečnostní rizika. Informace o tom, jak správně načíst knihovny DLL s různými verzemi Windows, najdete v dokumentaci 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;
}
Následující příklad kódu ukazuje, jak můžete použít GetVersion
k otestování, jestli je Shell32.dll verze 6.0 nebo novější.
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.
}
Verze projektu
Aby byla vaše aplikace kompatibilní s různými cílovými verzemi souboru .dll, jsou makra verzí obsažena v souborech hlaviček. Tato makra slouží k definování, vyloučení nebo opětovnému definování určitých definic pro různé verze knihovny DLL. Podrobné popisy těchto maker najdete v tématu Použití záhlaví systému Windows.
Například název makra _WIN32_IE se běžně nachází ve starších záhlavích. Zodpovídáte za definování makra jako šestnáctkového čísla. Toto číslo verze definuje cílovou verzi aplikace, která používá knihovnu DLL. Následující tabulka uvádí dostupná čísla verzí a vliv jednotlivých verzí na vaši aplikaci.
Verze | Popis |
---|---|
0x0200 | Aplikace je kompatibilní s Shell32.dll verze 4.00 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.00. |
0x0300 | Aplikace je kompatibilní s Shell32.dll verze 4.70 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.70. |
0x0400 | Aplikace je kompatibilní s Shell32.dll verze 4.71 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.71. |
0x0401 | Aplikace je kompatibilní s Shell32.dll verze 4.72 a novější. Aplikace nemůže implementovat funkce přidané po verzi 4.72. |
0x0500 | Aplikace je kompatibilní s Shell32.dll a Shlwapi.dll verze 5.0 a novější. Aplikace nemůže implementovat funkce přidané po verzi 5.0 Shell32.dll a Shlwapi.dll. |
0x0501 | Aplikace je kompatibilní s Shell32.dll a Shlwapi.dll verze 5.0 a novější. Aplikace nemůže implementovat funkce přidané po verzi 5.0 Shell32.dll a Shlwapi.dll. |
0x0600 | Aplikace je kompatibilní s Shell32.dll a Shlwapi.dll verze 6.0 a novější. Aplikace nemůže implementovat funkce přidané po verzi 6.0 Shell32.dll a Shlwapi.dll. |
Pokud v projektu nedefinujete _WIN32_IE makro, je automaticky definováno jako 0x0500. Pokud chcete definovat jinou hodnotu, můžete do direktiv kompilátoru v souboru make přidat následující kód; nahraďte požadovaným číslem verze 0x0400.
/D _WIN32_IE=0x0400
Další metodou je přidat řádek podobný následujícímu ve zdrojovém kódu před zahrnutím souborů hlaviček prostředí. Nahraďte požadované číslo verze 0x0400.
#define _WIN32_IE 0x0400
#include <commctrl.h>