Versi DLL Shell dan Shlwapi

Bagian ini menjelaskan cara menentukan versi Shell DLL mana yang dijalankan aplikasi Anda dan cara menargetkan aplikasi Anda untuk versi tertentu.

Nomor Versi DLL

Semua kecuali beberapa elemen pemrograman yang dibahas dalam dokumentasi Shell terkandung dalam dua DLL: Shell32.dll dan Shlwapi.dll. Karena penyempurnaan yang sedang berlangsung, versi yang berbeda dari DLL ini menerapkan fitur yang berbeda. Di seluruh dokumentasi referensi Shell, setiap elemen pemrograman menentukan nomor versi DLL minimum yang didukung. Nomor versi ini menunjukkan bahwa elemen pemrograman diimplementasikan dalam versi tersebut dan versi DLL berikutnya kecuali ditentukan lain. Jika tidak ada nomor versi yang ditentukan, elemen pemrograman diimplementasikan di semua versi DLL yang ada.

Sebelum Windows XP, versi Shell32.dll dan Shlwapi.dll baru terkadang disediakan dengan versi baru Windows Internet Explorer. Pada Windows XP, DLL tersebut tidak lagi disediakan sebagai file yang dapat didistribusikan ulang di luar versi baru Windows itu sendiri. Tabel berikut menguraikan versi DLL yang berbeda dan bagaimana versi DLL didistribusikan kembali ke Microsoft Internet Explorer 3.0, Windows 95, dan Microsoft Windows NT 4.0.

Shell32.dll versi 4.0 ditemukan di versi asli Windows 95 dan Microsoft Windows NT 4.0. Shell tidak diperbarui dengan rilis Internet Explorer 3.0, jadi Shell32.dll tidak memiliki versi 4.70. Shell32.dll versi 4.71 dan 4.72 dikirim dengan rilis Internet Explorer yang sesuai, tetapi belum tentu diinstal (lihat catatan 1). Untuk rilis berikutnya ke Microsoft Internet Explorer 4.01 dan Windows 98, nomor versi untuk Shell32.dll dan Shlwapi.dll menyimpang. Secara umum, Anda harus berasumsi bahwa DLL memiliki nomor versi yang berbeda dan menguji masing-masing secara terpisah.

Shell32.dll

Versi Platform Distribusi
4,0 Windows 95 dan Microsoft Windows NT 4.0
4,71 Microsoft Internet Explorer 4.0. Lihat catatan 1.
4.72 Internet Explorer 4.01 dan Windows 98. Lihat catatan 1.
5.0 Windows 2000 dan Windows Millennium Edition (Windows Me). Lihat catatan 2.
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

Versi Platform Distribusi
4,0 Windows 95 dan Microsoft Windows NT 4.0
4,71 Internet Explorer 4.0. Lihat catatan 1.
4.72 Internet Explorer 4.01 dan Windows 98. Lihat catatan 1.
4,7 Internet Explorer 3.x
5.0 Microsoft Internet Explorer 5 dan Windows 98 SE. Lihat catatan 2.
5.5 Microsoft Internet Explorer 5.5 dan Windows Millennium Edition (Windows Me)
6.0 Windows XP dan Windows Vista

Catatan 1: Semua sistem dengan Internet Explorer 4.0 atau 4.01 memiliki versi Shlwapi.dll terkait (masing-masing 4.71 atau 4.72). Namun, untuk sistem sebelum Windows 98, Internet Explorer 4.0 dan 4.01 dapat diinstal dengan atau tanpa apa yang dikenal sebagai Shell terintegrasi. Jika Internet Explorer diinstal dengan Shell terintegrasi, versi Shell32.dll terkait (4.71 atau 4.72) juga diinstal. Jika Internet Explorer diinstal tanpa Shell terintegrasi, Shell32.dll tetap sebagai versi 4.0. Dengan kata lain, kehadiran Shlwapi.dll versi 4.71 atau 4.72 pada sistem tidak menjamin bahwa Shell32.dll memiliki nomor versi yang sama. Semua sistem Windows 98 memiliki Shell32.dll versi 4.72.

Catatan 2: Versi 5.0 dari Shlwapi.dll didistribusikan dengan Internet Explorer 5 dan ditemukan di semua sistem tempat Internet Explorer 5 diinstal, dengan pengecualian Windows 2000. Versi 5.0 Shell32.dll didistribusikan secara asli dengan Windows 2000 dan Windows Millennium Edition (Windows Me), bersama dengan versi 5.0 Shlwapi.dll.

Menggunakan DllGetVersion untuk Menentukan Nomor Versi

Dimulai dengan versi 4.71, DLL Shell, antara lain, mulai mengekspor DllGetVersion. Fungsi ini dapat dipanggil oleh aplikasi untuk menentukan versi DLL mana yang ada pada sistem.

Catatan

DLL tidak selalu mengekspor DllGetVersion. Selalu uji untuk itu sebelum mencoba menggunakannya.

Untuk versi Windows yang lebih lama dari Windows 2000, DllGetVersion mengembalikan struktur DLLVERSIONINFO yang berisi nomor versi utama dan minor, nomor build, dan ID platform. Untuk sistem Windows 2000 dan yang lebih baru, DllGetVersion mungkin mengembalikan struktur DLLVERSIONINFO2 . Selain informasi yang diberikan melalui DLLVERSIONINFO, DLLVERSIONINFO2juga menyediakan nomor perbaikan yang mengidentifikasi paket layanan terbaru yang diinstal, yang menyediakan cara yang lebih kuat untuk membandingkan nomor versi. Karena anggota pertama DLLVERSIONINFO2 adalah struktur DLLVERSIONINFO , struktur yang lebih baru kompatibel mundur.

Menggunakan DllGetVersion

Fungsi GetVersion sampel berikut memuat DLL tertentu dan mencoba memanggil fungsi DllGetVersion-nya . Jika berhasil, ia menggunakan makro untuk mengemas nomor versi utama dan minor dari struktur DLLVERSIONINFO ke dalam DWORD yang dikembalikan ke aplikasi panggilan. Jika DLL tidak mengekspor DllGetVersion, fungsi mengembalikan nol. Dengan sistem Windows 2000 dan yang lebih baru, Anda dapat memodifikasi fungsi untuk menangani kemungkinan dllGetVersion mengembalikan struktur DLLVERSIONINFO2 . Jika demikian, gunakan informasi dalam anggota ullVersion struktur DLLVERSIONINFO2 tersebut untuk membandingkan versi, nomor build, dan rilis paket layanan. Makro MAKEDLLVERULL menyederhanakan tugas membandingkan nilai-nilai ini dengan yang ada di ullVersion.

Catatan

Menggunakan LoadLibrary salah dapat menimbulkan risiko keamanan. Lihat dokumentasi LoadLibrary untuk informasi tentang cara memuat DLL dengan benar dengan versi Windows yang berbeda.

#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;
}

Contoh kode berikut menggambarkan bagaimana Anda dapat menggunakan GetVersion untuk menguji apakah Shell32.dll adalah versi 6.0 atau yang lebih baru.

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.
}

Versi Proyek

Untuk memastikan bahwa aplikasi Anda kompatibel dengan versi file .dll yang ditargetkan yang berbeda, makro versi ada di file header. Makro ini digunakan untuk menentukan, mengecualikan, atau mendefinisikan ulang definisi tertentu untuk versi DLL yang berbeda. Lihat Menggunakan Header Windows untuk deskripsi mendalam tentang makro ini.

Misalnya, nama makro _WIN32_IE umumnya ditemukan di header yang lebih lama. Anda bertanggung jawab untuk mendefinisikan makro sebagai angka heksadesimal. Nomor versi ini menentukan versi target aplikasi yang menggunakan DLL. Tabel berikut menunjukkan nomor versi yang tersedia dan efek yang dimiliki masing-masing pada aplikasi Anda.

Versi Deskripsi
0x0200 Aplikasi ini kompatibel dengan Shell32.dll versi 4.00 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 4.00.
0x0300 Aplikasi ini kompatibel dengan Shell32.dll versi 4.70 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 4.70.
0x0400 Aplikasi ini kompatibel dengan Shell32.dll versi 4.71 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 4.71.
0x0401 Aplikasi ini kompatibel dengan Shell32.dll versi 4.72 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 4.72.
0x0500 Aplikasi ini kompatibel dengan Shell32.dll dan Shlwapi.dll versi 5.0 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 5.0 Shell32.dll dan Shlwapi.dll.
0x0501 Aplikasi ini kompatibel dengan Shell32.dll dan Shlwapi.dll versi 5.0 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 5.0 Shell32.dll dan Shlwapi.dll.
0x0600 Aplikasi ini kompatibel dengan Shell32.dll dan Shlwapi.dll versi 6.0 dan yang lebih baru. Aplikasi tidak dapat menerapkan fitur yang ditambahkan setelah versi 6.0 Shell32.dll dan Shlwapi.dll.

Jika Anda tidak menentukan makro _WIN32_IE dalam proyek Anda, makro tersebut secara otomatis didefinisikan sebagai 0x0500. Untuk menentukan nilai yang berbeda, Anda dapat menambahkan yang berikut ini ke arahan kompilator dalam file buatan Anda; ganti nomor versi yang diinginkan untuk 0x0400.

/D _WIN32_IE=0x0400

Metode lain adalah menambahkan baris yang mirip dengan yang berikut ini dalam kode sumber Anda sebelum Anda menyertakan file header Shell. Ganti nomor versi yang diinginkan untuk 0x0400.

#define _WIN32_IE 0x0400
#include <commctrl.h>