Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tej sekcji opisano sposób określania wersji bibliotek DLL powłoki, na której działa aplikacja, oraz sposobu określania lokalizacji docelowej aplikacji dla określonej wersji.
- numery wersji biblioteki DLL
- używanie biblioteki DllGetVersion do określania numeru wersji
- wersje projektu
Numery wersji bibliotek DLL
Wszystkie elementy programowania omówione w dokumentacji powłoki znajdują się w dwóch bibliotekach DLL: Shell32.dll i Shlwapi.dll. Ze względu na ciągłe ulepszenia różne wersje tych bibliotek DLL implementują różne funkcje. W dokumentacji referencyjnej powłoki każdy element programowania określa minimalny obsługiwany numer wersji biblioteki DLL. Ten numer wersji wskazuje, że element programowania jest implementowany w tej wersji i kolejnych wersjach biblioteki DLL, chyba że określono inaczej. Jeśli nie określono numeru wersji, element programowania jest implementowany we wszystkich istniejących wersjach biblioteki DLL.
Przed systemem Windows XP nowe wersje Shell32.dll i Shlwapi.dll były czasami dostarczane z nowymi wersjami programu Windows Internet Explorer. Od systemu Windows XP te biblioteki DLL nie były już udostępniane jako pliki redystrybucyjne poza nowymi wersjami systemu Windows. W poniższej tabeli przedstawiono różne wersje bibliotek DLL i sposób ich dystrybucji z powrotem do programu Microsoft Internet Explorer 3.0, Windows 95 i Microsoft Windows NT 4.0.
Shell32.dll w wersji 4.0 znajduje się w oryginalnych wersjach systemów Windows 95 i Microsoft Windows NT 4.0. Powłoka nie została zaktualizowana w wersji Internet Explorer 3.0, więc Shell32.dll nie ma wersji 4.70. Shell32.dll wersje 4.71 i 4.72 zostały dostarczone z odpowiednimi wersjami programu Internet Explorer, ale niekoniecznie zostały zainstalowane (patrz uwaga 1). W przypadku wersji kolejnych do programów Microsoft Internet Explorer 4.01 i Windows 98 numery wersji dla Shell32.dll i Shlwapi.dll rozbieżne. Ogólnie rzecz biorąc, należy założyć, że biblioteki DLL mają różne numery wersji i przetestuj je osobno.
Shell32.dll
| Wersja | Platforma dystrybucji |
|---|---|
| 4.0 | Windows 95 i Microsoft Windows NT 4.0 |
| 4.71 | Microsoft Internet Explorer 4.0. Zobacz notatkę 1. |
| 4.72 | Internet Explorer 4.01 i Windows 98. Zobacz notatkę 1. |
| 5.0 | Windows 2000 i Windows Millennium Edition (Windows Me). Zobacz notatkę 2. |
| 6.0 | Windows XP |
| 6.0.1 | Windows Vista |
| 6.1 | Windows 7 |
Shlwapi.dll
| Wersja | Platforma dystrybucji |
|---|---|
| 4.0 | Windows 95 i Microsoft Windows NT 4.0 |
| 4.71 | Internet Explorer 4.0. Zobacz notatkę 1. |
| 4.72 | Internet Explorer 4.01 i Windows 98. Zobacz notatkę 1. |
| 4.7 | Internet Explorer 3.x |
| 5.0 | Microsoft Internet Explorer 5 i Windows 98 SE. Zobacz notatkę 2. |
| 5.5 | Microsoft Internet Explorer 5.5 i Windows Millennium Edition (Windows Me) |
| 6.0 | Windows XP i Windows Vista |
Uwaga 1: Wszystkie systemy z programem Internet Explorer 4.0 lub 4.01 miały skojarzoną wersję Shlwapi.dll (odpowiednio 4.71 lub 4.72). Jednak w przypadku systemów wcześniejszych niż Windows 98 można zainstalować programy Internet Explorer 4.0 i 4.01 z systemem lub bez tego, co było znane jako zintegrowana powłoka . Jeśli program Internet Explorer został zainstalowany ze zintegrowaną powłoką, zainstalowano również skojarzoną wersję Shell32.dll (4.71 lub 4.72). Jeśli program Internet Explorer został zainstalowany bez zintegrowanej powłoki, Shell32.dll pozostał w wersji 4.0. Innymi słowy, obecność wersji 4.71 lub 4.72 Shlwapi.dll w systemie nie gwarantuje, że Shell32.dll ma ten sam numer wersji. Wszystkie systemy Windows 98 mają wersję 4.72 Shell32.dll.
Uwaga 2: wersja 5.0 Shlwapi.dll została rozpowszechniona w programie Internet Explorer 5 i została znaleziona we wszystkich systemach, w których zainstalowano program Internet Explorer 5, z wyjątkiem systemu Windows 2000. Wersja 5.0 Shell32.dll została dystrybuowana natywnie z systemami Windows 2000 i Windows Millennium Edition (Windows Me) wraz z wersją 5.0 Shlwapi.dll.
Określanie numeru wersji przy użyciu biblioteki DllGetVersion
Począwszy od wersji 4.71 biblioteki DLL powłoki, między innymi, zaczęły eksportować DllGetVersion. Tę funkcję można wywołać przez aplikację, aby określić, która wersja biblioteki DLL jest obecna w systemie.
Nuta
Biblioteki DLL nie muszą eksportować DllGetVersion. Zawsze testuj go przed podjęciem próby użycia.
W przypadku wersji systemu Windows starszych niż Windows 2000 DllGetVersion zwraca strukturę DLLVERSIONINFO zawierającą główne i pomocnicze numery wersji, numer kompilacji i identyfikator platformy. W przypadku systemów Windows 2000 i nowszych DllGetVersion może zamiast tego zwrócić strukturę DLLVERSIONINFO2. Oprócz informacji dostarczonych za pośrednictwem DLLVERSIONINFO, DLLVERSIONINFO2również zawiera numer poprawki, który identyfikuje najnowszy zainstalowany dodatek Service Pack, który zapewnia bardziej niezawodny sposób porównywania numerów wersji. Ponieważ pierwszy element członkowski DLLVERSIONINFO2 jest strukturą DLLVERSIONINFO, późniejsza struktura jest zgodna z poprzednimi wersjami.
Korzystanie z biblioteki DllGetVersion
Poniższa przykładowa funkcja GetVersion ładuje określoną bibliotekę DLL i próbuje wywołać funkcję DllGetVersion. Jeśli operacja powiedzie się, używa makra do spakowania głównych i pomocniczych numerów wersji z struktury DLLVERSIONINFO do DWORD, która jest zwracana do aplikacji wywołującej. Jeśli biblioteka DLL nie eksportuje DllGetVersion, funkcja zwraca zero. W systemie Windows 2000 i nowszych można zmodyfikować funkcję w celu obsługi możliwości, że DllGetVersion zwraca strukturę DLLVERSIONINFO2. Jeśli tak, użyj informacji w tym DLLVERSIONINFO2 struktury elementu członkowskiego ullVersion do porównywania wersji, numerów kompilacji i wydań dodatku Service Pack. Makro MAKEDLLVERULL upraszcza zadanie porównywania tych wartości z tymi w ullVersion.
Nuta
Użycie LoadLibrary niepoprawnie może stanowić zagrożenie bezpieczeństwa. Zapoznaj się z dokumentacją LoadLibrary, aby uzyskać informacje na temat prawidłowego ładowania bibliotek DLL z różnymi wersjami systemu Windows.
#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;
}
Poniższy przykład kodu ilustruje, jak można użyć GetVersion do przetestowania, czy Shell32.dll jest w wersji 6.0 lub nowszej.
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.
}
Wersje projektu
Aby upewnić się, że aplikacja jest zgodna z różnymi docelowymi wersjami pliku .dll, makra wersji znajdują się w plikach nagłówków. Te makra służą do definiowania, wykluczania lub ponownego definiowania określonych definicji dla różnych wersji biblioteki DLL. Aby uzyskać szczegółowy opis tych makr, zobacz Using the Windows Headers (Używanie nagłówków systemu Windows).
Na przykład nazwa makra _WIN32_IE jest często spotykana w starszych nagłówkach. Odpowiadasz za zdefiniowanie makra jako liczby szesnastkowej. Ten numer wersji definiuje docelową wersję aplikacji korzystającej z biblioteki DLL. W poniższej tabeli przedstawiono dostępne numery wersji i wpływ, jaki ma każda z nich w aplikacji.
| Wersja | Opis |
|---|---|
| 0x0200 | Aplikacja jest zgodna z wersją Shell32.dll w wersji 4.00 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.00. |
| 0x0300 | Aplikacja jest zgodna z wersją Shell32.dll w wersji 4.70 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.70. |
| 0x0400 | Aplikacja jest zgodna z wersją Shell32.dll w wersji 4.71 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.71. |
| 0x0401 | Aplikacja jest zgodna z wersją Shell32.dll w wersji 4.72 lub nowszej. Aplikacja nie może zaimplementować funkcji, które zostały dodane po wersji 4.72. |
| 0x0500 | Aplikacja jest zgodna z Shell32.dll i Shlwapi.dll w wersji 5.0 lub nowszej. Aplikacja nie może zaimplementować funkcji dodanych po wersji 5.0 Shell32.dll i Shlwapi.dll. |
| 0x0501 | Aplikacja jest zgodna z Shell32.dll i Shlwapi.dll w wersji 5.0 lub nowszej. Aplikacja nie może zaimplementować funkcji dodanych po wersji 5.0 Shell32.dll i Shlwapi.dll. |
| 0x0600 | Aplikacja jest zgodna z Shell32.dll i Shlwapi.dll w wersji 6.0 lub nowszej. Aplikacja nie może zaimplementować funkcji dodanych po wersji 6.0 Shell32.dll i Shlwapi.dll. |
Jeśli nie zdefiniujesz makra _WIN32_IE w projekcie, zostanie ono automatycznie zdefiniowane jako 0x0500. Aby zdefiniować inną wartość, możesz dodać następujące elementy do dyrektyw kompilatora w pliku make; zastąp żądany numer wersji 0x0400.
/D _WIN32_IE=0x0400
Inną metodą jest dodanie wiersza podobnego do poniższego w kodzie źródłowym przed dołączeniem plików nagłówka powłoki. Zastąp żądany numer wersji 0x0400.
#define _WIN32_IE 0x0400
#include <commctrl.h>