Shell ve Shlwapi DLL Sürümleri
Bu bölümde, uygulamanızın hangi Kabuk DLL'leri sürümünde çalıştığının nasıl belirleneceği ve uygulamanızın belirli bir sürüm için nasıl hedefleneceğinin nasıl belirleneceği açıklanır.
- DLL Sürüm Numaraları
-
Sürüm Numarasını Belirlemek için DllGetVersion Kullanma
- DllGetVersion Kullanarak
- proje sürümlerini
DLL Sürüm Numaraları
Shell belgelerinde ele alınan birkaç programlama öğesi dışında tümü iki DLL'de yer alır: Shell32.dll ve Shlwapi.dll. Devam eden geliştirmeler nedeniyle, bu DLL'lerin farklı sürümleri farklı özellikler uygular. Kabuk başvuru belgeleri boyunca, her programlama öğesi desteklenen en düşük DLL sürüm numarasını belirtir. Bu sürüm numarası, programlama öğesinin aksi belirtilmediği sürece bu sürümde ve DLL'nin sonraki sürümlerinde uygulandığını gösterir. Sürüm numarası belirtilmezse, programlama öğesi DLL'nin tüm mevcut sürümlerinde uygulanır.
Windows XP'nin öncesinde, yeni Shell32.dll ve Shlwapi.dll sürümleri bazen Windows Internet Explorer'ın yeni sürümleriyle sağlanıyordu. Windows XP itibarıyla, bu DLL'ler artık Windows'un yeni sürümlerinin dışında yeniden dağıtılabilir dosyalar olarak sağlanmadı. Aşağıdaki tabloda farklı DLL sürümleri ve bunların Microsoft Internet Explorer 3.0, Windows 95 ve Microsoft Windows NT 4.0'a kadar uzanan nasıl dağıtıldığı özetlenmektedir.
Shell32.dll sürüm 4.0, Windows 95 ve Microsoft Windows NT 4.0'ın özgün sürümlerinde bulunur. Shell, Internet Explorer 3.0 sürümüyle güncelleştirilmediğinden Shell32.dll 4.70 sürümüne sahip değildir. Shell32.dll sürüm 4.71 ve 4.72, ilgili Internet Explorer sürümleriyle birlikte gönderildi, ancak yüklü olmaları zorunlu değildi (bkz. not 1). Microsoft Internet Explorer 4.01 ve Windows 98'i izleyen sürümler için Shell32.dll ve Shlwapi.dll sürüm numaraları birbirinden ayrılır. Genel olarak, DLL'lerin farklı sürüm numaraları olduğunu varsaymalı ve her birini ayrı ayrı test etmelisiniz.
Shell32.dll
Sürüm | Dağıtım Platformu |
---|---|
4.0 | Windows 95 ve Microsoft Windows NT 4.0 |
4.71 | Microsoft Internet Explorer 4.0. Bkz. not 1. |
4.72 | Internet Explorer 4.01 ve Windows 98. Bkz. not 1. |
5.0 | Windows 2000 ve Windows Millennium Edition (Windows Me). Bkz. not 2. |
6.0 | Windows XP |
6.0.1 | Windows Vista |
6.1 | Windows 7 |
Shlwapi.dll
Sürüm | Dağıtım Platformu |
---|---|
4.0 | Windows 95 ve Microsoft Windows NT 4.0 |
4.71 | Internet Explorer 4.0. Bkz. not 1. |
4.72 | Internet Explorer 4.01 ve Windows 98. Bkz. not 1. |
4.7 | Internet Explorer 3.x |
5.0 | Microsoft Internet Explorer 5 ve Windows 98 SE. Bkz. not 2. |
5.5 | Microsoft Internet Explorer 5.5 ve Windows Millennium Edition (Windows Me) |
6.0 | Windows XP ve Windows Vista |
Not 1: Internet Explorer 4.0 veya 4.01'e sahip tüm sistemlerin ilişkili Shlwapi.dll sürümü (sırasıyla 4.71 veya 4.72) vardı. Ancak, Windows 98 öncesi sistemler için Internet Explorer 4.0 ve 4.01, tümleşik Kabukolarak bilinen ile veya olmadan yüklenebilir. Internet Explorer tümleşik Kabuk ile yüklendiyse, Shell32.dll ilişkili sürümü de (4.71 veya 4.72) yüklenir. Internet Explorer tümleşik Kabuk olmadan yüklendiyse Shell32.dll sürüm 4.0 olarak kalır. Başka bir deyişle, bir sistemde Shlwapi.dll 4.71 veya 4.72 sürümünün bulunması, Shell32.dll aynı sürüm numarasına sahip olduğunu garanti etmez. Tüm Windows 98 sistemleri Shell32.dll4.72 sürümüne sahiptir.
Not 2: Shlwapi.dll Sürüm 5.0, Internet Explorer 5 ile dağıtıldı ve Windows 2000 dışında Internet Explorer 5'in yüklü olduğu tüm sistemlerde bulundu. Shell32.dll sürüm 5.0, Shlwapi.dllsürüm 5.0 ile birlikte Windows 2000 ve Windows Millennium Edition (Windows Me) ile yerel olarak dağıtıldı.
Sürüm Numarasını Belirlemek için DllGetVersion Kullanma
Sürüm 4.71'den başlayarak Kabuk DLL'leri de DllGetVersiondışarı aktarmaya başladı. Bu işlev, sistemde hangi DLL sürümünün mevcut olduğunu belirlemek için bir uygulama tarafından çağrılabilir.
Not
DLL'lerin dllGetVersiondışarı aktarması gerekmez. Kullanmayı denemeden önce her zaman test edin.
Windows 2000'den önceki Windows sürümleri için DllGetVersion, ana ve ikincil sürüm numaralarını, derleme numarasını ve platform kimliğini içeren DLLVERSIONINFO yapısını döndürür. Windows 2000 ve sonraki sistemler için DllGetVersion bunun yerine DLLVERSIONINFO2 bir yapı döndürebilir. DLLVERSIONINFOaracılığıyla sağlanan bilgilere ek olarak DLLVERSIONINFO2, sürüm numaralarını karşılaştırmak için daha sağlam bir yol sağlayan en son yüklü hizmet paketini tanımlayan düzeltme numarasını da sağlar. DLLVERSIONINFO2 ilk üyesi DLLVERSIONINFO yapısı olduğundan, sonraki yapı geriye dönük olarak uyumludur.
DllGetVersion kullanma
Aşağıdaki örnek işlev GetVersion
belirtilen DLL'yi yükler ve DllGetVersion işlevini çağırmaya çalışır. Başarılı olursa, DLLVERSIONINFO yapısındaki ana ve ikincil sürüm numaralarını çağıran uygulamaya döndürülen bir DWORD paketlemek için bir makro kullanır. DLL DllGetVersiondışarı aktarmazsa işlev sıfır döndürür. Windows 2000 ve üzeri sistemlerde, DllGetVersionDLLVERSIONINFO2 bir yapı döndürme olasılığını işlemek için işlevini değiştirebilirsiniz. Öyleyse, sürümleri, derleme numaralarını ve hizmet paketi sürümlerini karşılaştırmak için bu DLLVERSIONINFO2 yapısının ullVersion üyesindeki bilgileri kullanın. MAKEDLLVERULLmakro, bu değerleri ullVersioniçindekilerle karşılaştırma görevini basitleştirir.
Not
LoadLibrary yanlış kullanılması güvenlik riskleri oluşturabilir. Windows'un farklı sürümlerine sahip DLL'leri doğru şekilde yükleme hakkında bilgi için LoadLibrary belgelerine bakın.
#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;
}
Aşağıdaki kod örneğinde, Shell32.dll sürüm 6.0 veya üzeri olup olmadığını test etmek için GetVersion
nasıl kullanabileceğiniz gösterilmektedir.
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.
}
Proje Sürümleri
Uygulamanızın bir .dll dosyasının farklı hedeflenen sürümleriyle uyumlu olduğundan emin olmak için, üst bilgi dosyalarında sürüm makroları bulunur. Bu makrolar, DLL'nin farklı sürümleri için belirli tanımları tanımlamak, dışlamak veya yeniden tanımlamak için kullanılır. Bu makroların ayrıntılı açıklaması için bkz. windows üst bilgileri kullanma.
Örneğin, _WIN32_IE makro adı genellikle eski üst bilgilerde bulunur. Makroyu onaltılık sayı olarak tanımlamak sizin sorumluluğundadır. Bu sürüm numarası, DLL'yi kullanan uygulamanın hedef sürümünü tanımlar. Aşağıdaki tabloda kullanılabilir sürüm numaraları ve her birinin uygulamanız üzerindeki etkisi gösterilmektedir.
Sürüm | Açıklama |
---|---|
0x0200 | Uygulama, Shell32.dll sürüm 4.00 ve üzeri ile uyumludur. Uygulama, 4.00 sürümünden sonra eklenen özellikleri uygulayamaz. |
0x0300 | Uygulama, Shell32.dll sürüm 4.70 ve üzeri ile uyumludur. Uygulama, 4.70 sürümünden sonra eklenen özellikleri uygulayamaz. |
0x0400 | Uygulama, Shell32.dll sürüm 4.71 ve üzeri ile uyumludur. Uygulama, 4.71 sürümünden sonra eklenen özellikleri uygulayamaz. |
0x0401 | Uygulama, Shell32.dll sürüm 4.72 ve üzeri ile uyumludur. Uygulama, 4.72 sürümünden sonra eklenen özellikleri uygulayamaz. |
0x0500 | Uygulama, Shell32.dll ve Shlwapi.dll sürüm 5.0 ve sonraki sürümlerle uyumludur. Uygulama, Shell32.dll ve Shlwapi.dll5.0 sürümünden sonra eklenen özellikleri uygulayamaz. |
0x0501 | Uygulama, Shell32.dll ve Shlwapi.dll sürüm 5.0 ve sonraki sürümlerle uyumludur. Uygulama, Shell32.dll ve Shlwapi.dll5.0 sürümünden sonra eklenen özellikleri uygulayamaz. |
0x0600 | Uygulama, Shell32.dll ve Shlwapi.dll sürüm 6.0 ve üzeri ile uyumludur. Uygulama, Shell32.dll ve Shlwapi.dll6.0 sürümünden sonra eklenen özellikleri uygulayamaz. |
Projenizde _WIN32_IE makroyu tanımlamazsanız, otomatik olarak 0x0500 olarak tanımlanır. Farklı bir değer tanımlamak için make dosyanızdaki derleyici yönergelerine aşağıdakileri ekleyebilirsiniz; 0x0400 için istediğiniz sürüm numarasını değiştirin.
/D _WIN32_IE=0x0400
Başka bir yöntem, Kabuk üst bilgi dosyalarını eklemeden önce kaynak kodunuzda aşağıdakine benzer bir satır eklemektir. 0x0400 için istediğiniz sürüm numarasını değiştirin.
#define _WIN32_IE 0x0400
#include <commctrl.h>