Aracılığıyla paylaş


Ortak Denetim Sürümleri

Bu konu başlığı altında, Ortak Denetim kitaplığının (ComCtl32.dll) kullanılabilir sürümleri, uygulamanızın kullandığı sürümün nasıl tanımlandığını ve uygulamanızın belirli bir sürüm için nasıl hedeflendiğini açıklar.

Bu konu aşağıdaki bölümleri içerir.

Ortak Denetim DLL Sürüm Numaraları

Yaygın denetimler için destek, Windows'un 32 bit ve 64 bit sürümlerini içeren ComCtl32.dlltarafından sağlanır. DLL'nin ardışık her sürümü, önceki sürümlerin özelliklerini ve API'sini destekler ve yeni özellikler ekler.

ComCtl32.dll çeşitli sürümleri Internet Explorer ile dağıtıldığı için, etkin olan sürüm bazen işletim sistemiyle birlikte gönderilen sürümden farklıdır. Bu nedenle uygulamanızın hangi ComCtl32.dll sürümünün mevcut olduğunu doğrudan belirlemesi gerekir.

Ortak denetim başvuru belgelerinde, birçok 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.

Aşağıdaki tabloda farklı DLL sürümleri ve bunların desteklenen işletim sistemine nasıl dağıtıldığı özetlenmektedir.

ComCtl32.dll

Sürüm

Dağıtım Platformu

5.81

Microsoft Internet Explorer 5.01, Microsoft Internet Explorer 5.5 ve Microsoft Internet Explorer 6

5.82

Windows Server 2003, Windows Vista, Windows Server 2008 ve Windows 7

6.0

Windows Server 2003

6.10

Windows Vista, Windows Server 2008 ve Windows 7

 

Farklı Ortak Denetim Sürümleri için Yapı Boyutları

Ortak denetimlerde devam eden geliştirmeler, yapıların çoğunu genişletme gereksinimine neden oldu. Bu nedenle, yapıların boyutu Farklı Commctrl.h sürümleri arasında değişmiştir. Ortak denetim yapılarının çoğu parametrelerden biri olarak bir yapı boyutuna sahip olduğundan, boyut tanınmazsa ileti veya işlev başarısız olabilir. Bunu düzeltmek için, farklı ComCtl32.dllsürümünü hedeflemeye yardımcı olmak için yapı boyutu sabitleri tanımlanmıştır. Aşağıdaki liste, yapı boyutu sabitlerini tanımlar.

Yapı Boyutu Sabiti Tanım
HDITEM_V1_SIZE Sürüm 4.0'da HDITEM yapısının boyutu.
IMAGELISTDRAWPARAMS_V3_SIZE 5.9 sürümündeki IMAGELISTDRAWPARAMS yapısının boyutu.
LVCOLUMN_V1_SIZE sürüm 4.0'da LVCOLUMN yapısının boyutu.
LVGROUP_V5_SIZE 6.0 sürümünde LVGROUP yapısının boyutu.
LVHITTESTINFO_V1_SIZE 4.0 sürümünde LVHITTESTINFO yapısının boyutu.
LVITEM_V1_SIZE 4.0 sürümünde LVITEM yapısının boyutu.
LVITEM_V5_SIZE 6.0 sürümünde LVITEM yapısının boyutu.
LVTILEINFO_V5_SIZE sürüm 6.0'da LVTILEINFO yapısının boyutu.
MCHITTESTINFO_V1_SIZE Sürüm 4.0'da MCHITTESTINFO yapısının boyutu.
NMLVCUSTOMDRAW_V3_SIZE 4.7 sürümünde NMLVCUSTOMDRAW yapısının boyutu.
NMTTDISPINFO_V1_SIZE 4.0 sürümündeki NMTTDISPINFO yapısının boyutu.
NMTVCUSTOMDRAW_V3_SIZE 4.7 sürümünde NMTVCUSTOMDRAW yapısının boyutu.
PROPSHEETHEADER_V1_SIZE 4.0 sürümündeki PROPSHEETHEADER yapısının boyutu.
PROPSHEETPAGE_V1_SIZE 4.0 sürümündeki PROPSHEETPAGE yapısının boyutu.
REBARBANDINFO_V3_SIZE sürüm 4.7'de REBARBANDINFO yapısının boyutu.
REBARBANDINFO_V6_SIZE Sürüm 6.0'da REBARBANDINFOyapısınınboyutu.
TTTOOLINFO_V1_SIZE 4.0 sürümünde TOOLINFO yapısının boyutu.
TTTOOLINFO_V2_SIZE 4.7 sürümünde TOOLINFO yapısının boyutu.
TTTOOLINFO_V3_SIZE 6.0 sürümündeki TOOLINFO yapısının boyutu.
TVINSERTSTRUCT_V1_SIZE Sürüm 4.0'da TVINSERTSTRUCT yapısının boyutu.

 

Sürüm Numarasını Belirlemek için DllGetVersion Kullanma

DllGetVersion işlevi, sistemde hangi DLL sürümünün mevcut olduğunu belirlemek için bir uygulama tarafından çağrılabilir.

DllGetVersion bir DLLVERSIONINFO2 yapısı döndürür. 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.

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. DllGetVersion bir DLLVERSIONINFO2 yapısı 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ği, ComCtl32.dll sürüm 6.0 veya üzeri olup olmadığını test etmek için GetVersion nasıl kullanabileceğinizi gösterir.

LPCTSTR lpszDllName = L"C:\\Windows\\System32\\ComCtl32.dll";
DWORD dwVer = GetVersion(lpszDllName);
DWORD dwTarget = PACKVERSION(6,0);

if(dwVer >= dwTarget)
{
    // This version of ComCtl32.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
0x0300 Uygulama, ComCtl32.dll sürüm 4.70 ve üzeri ile uyumludur. Uygulama, 4.70 sürümünden sonra eklenen özellikleri uygulayamaz.
0x0400 Uygulama, ComCtl32.dll sürüm 4.71 ve üzeri ile uyumludur. Uygulama, 4.71 sürümünden sonra eklenen özellikleri uygulayamaz.
0x0401 Uygulama, ComCtl32.dll sürüm 4.72 ve üzeri ile uyumludur. Uygulama, 4.72 sürümünden sonra eklenen özellikleri uygulayamaz.
0x0500 Uygulama, ComCtl32.dll sürüm 5.80 ve üzeri ile uyumludur. Uygulama, 5.80 sürümünden sonra eklenen özellikleri uygulayamaz.
0x0501 Uygulama, ComCtl32.dll sürüm 5.81 ve üzeri ile uyumludur. Uygulama, 5.81 sürümünden sonra eklenen özellikleri uygulayamaz.
0x0600 Uygulama, ComCtl32.dll sürüm 6.0 ve üzeri ile uyumludur. Uygulama, 6.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>

Yaygın Denetimler hakkında