Shell 및 Shlwapi DLL 버전

이 섹션에서는 애플리케이션이 실행 중인 Shell DLL의 버전을 확인하는 방법과 특정 버전에 대해 애플리케이션을 대상으로 지정하는 방법을 설명합니다.

DLL 버전 번호

셸 설명서에 설명된 소수의 프로그래밍 요소를 제외한 모든 프로그래밍 요소는 Shell32.dll 및 Shlwapi.dll 두 개의 DLL에 포함되어 있습니다. 지속적인 향상된 기능으로 인해 이러한 DLL의 여러 버전이 서로 다른 기능을 구현합니다. Shell 참조 설명서 전체에서 각 프로그래밍 요소는 지원되는 최소 DLL 버전 번호를 지정합니다. 이 버전 번호는 달리 지정하지 않는 한 프로그래밍 요소가 DLL의 해당 버전 및 후속 버전에서 구현됨을 나타냅니다. 버전 번호가 지정되지 않은 경우 프로그래밍 요소는 DLL의 모든 기존 버전에서 구현됩니다.

Windows XP 이전에는 새 Shell32.dll 및 Shlwapi.dll 버전이 Windows Internet Explorer 새 버전과 함께 제공되는 경우도 있었습니다. Windows XP를 기준으로 해당 DLL은 더 이상 새 버전의 Windows 자체 외부에서 재배포 가능 파일로 제공되지 않았습니다. 다음 표에서는 다양한 DLL 버전과 이러한 버전이 Microsoft Internet Explorer 3.0, Windows 95 및 Microsoft Windows NT 4.0으로 다시 배포된 방법을 간략하게 설명합니다.

Shell32.dll 버전 4.0은 Windows 95 및 Microsoft Windows NT 4.0의 원래 버전에서 찾을 수 있습니다. 셸이 Internet Explorer 3.0 릴리스로 업데이트되지 않았으므로 Shell32.dll 버전 4.70이 없습니다. Shell32.dll 버전 4.71 및 4.72는 해당 인터넷 Explorer 릴리스와 함께 제공되었지만 반드시 설치되지는 않았습니다(참고 1 참조). Microsoft Internet Explorer 4.01 및 Windows 98 이후 릴리스의 경우 Shell32.dll 및 Shlwapi.dll 버전 번호가 다릅니다. 일반적으로 DLL에는 버전 번호가 서로 다르고 각 버전 번호가 개별적으로 테스트된다고 가정해야 합니다.

Shell32.dll

버전 배포 플랫폼
4.0 Windows 95 및 Microsoft Windows NT 4.0
4.71 Microsoft Internet Explorer 4.0. 참고 1을 참조하십시오.
4.72 인터넷 Explorer 4.01 및 Windows 98. 참고 1을 참조하십시오.
5.0 Windows 2000 및 Windows Millennium Edition(Windows Me). 참고 2를 참조하세요.
6.0 Windows XP
6.0.1 Windows Vista
6.1 Windows 7

Shlwapi.dll

버전 배포 플랫폼
4.0 Windows 95 및 Microsoft Windows NT 4.0
4.71 인터넷 Explorer 4.0. 참고 1을 참조하십시오.
4.72 인터넷 Explorer 4.01 및 Windows 98. 참고 1을 참조하십시오.
4.7 인터넷 Explorer 3.x
5.0 Microsoft Internet Explorer 5 및 Windows 98 SE. 참고 2를 참조하세요.
5.5 Microsoft Internet Explorer 5.5 및 Windows Millennium Edition(Windows Me)
6.0 Windows XP 및 Windows Vista

참고 1: 인터넷 Explorer 4.0 또는 4.01이 있는 모든 시스템에는 연결된 버전의 Shlwapi.dll(각각 4.71 또는 4.72)이 있습니다. 그러나 Windows 98 이전 시스템의 경우 인터넷 Explorer 4.0 및 4.01은 통합 셸을 사용하거나 사용하지 않고 설치할 수 있습니다. 통합 셸과 함께 인터넷 Explorer 설치된 경우 연결된 버전의 Shell32.dll(4.71 또는 4.72)도 설치되었습니다. 통합 셸 없이 인터넷 Explorer 설치된 경우 Shell32.dll 버전 4.0으로 유지됩니다. 즉, 시스템에 Shlwapi.dll 버전 4.71 또는 4.72가 있다고 해서 Shell32.dll 버전 번호가 동일하지는 않습니다. 모든 Windows 98 시스템에는 Shell32.dll 버전 4.72가 있습니다.

참고 2: Shlwapi.dll 버전 5.0은 인터넷 Explorer 5와 함께 배포되었으며 Windows 2000을 제외하고 인터넷 Explorer 5가 설치된 모든 시스템에서 발견되었습니다. Shell32.dll 버전 5.0은 기본적으로 Windows 2000 및 Windows Millennium Edition(Windows Me)과 함께 Shlwapi.dll 버전 5.0과 함께 배포되었습니다.

DllGetVersion을 사용하여 버전 번호 확인

버전 4.71부터 셸 DLL은 DllGetVersion 내보내기를 시작했습니다. 이 함수는 애플리케이션에서 호출하여 시스템에 있는 DLL 버전을 확인할 수 있습니다.

참고

DLL이 반드시 DllGetVersion을 내보내는 것은 아닙니다. 사용을 시도하기 전에 항상 테스트합니다.

Windows 2000 이전 버전의 경우 DllGetVersion 은 주 버전 번호와 부 버전 번호, 빌드 번호 및 플랫폼 ID를 포함하는 DLLVERSIONINFO 구조를 반환합니다. Windows 2000 이상 시스템의 경우 DllGetVersionDLLVERSIONINFO2 구조를 대신 반환할 수 있습니다. DLLVERSIONINFO를 통해 제공되는 정보 외에도 DLLVERSIONINFO2는 최신 설치된 서비스 팩을 식별하는 핫픽스 번호도 제공하므로 버전 번호를 보다 강력하게 비교할 수 있습니다. DLLVERSIONINFO2의 첫 번째 멤버는 DLLVERSIONINFO 구조체이므로 이후 구조체는 이전 버전과 호환됩니다.

DllGetVersion 사용

다음 샘플 함수 GetVersion은 지정된 DLL을 로드하고 DllGetVersion 함수 호출을 시도합니다. 성공하면 매크로를 사용하여 DLLVERSIONINFO 구조체의 주 버전 번호와 부 버전 번호를 호출 애플리케이션에 반환되는 DWORD로 압축합니다. DLL이 DllGetVersion을 내보내지 않으면 함수는 0을 반환합니다. Windows 2000 이상 시스템에서는 DllGetVersionDLLVERSIONINFO2 구조를 반환할 가능성을 처리하도록 함수를 수정할 수 있습니다. 그렇다면 해당 DLLVERSIONINFO2 구조체의 ullVersion 멤버에 있는 정보를 사용하여 버전, 빌드 번호 및 서비스 팩 릴리스를 비교합니다. MAKEDLLVERULL 매크로는 이러한 값을 ullVersion의 값과 비교하는 작업을 단순화합니다.

참고

LoadLibrary를 잘못 사용하면 보안 위험이 발생할 수 있습니다. 다양한 버전의 Windows에서 DLL을 올바르게 로드하는 방법에 대한 자세한 내용은 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;
}

다음 코드 예제에서는 를 사용하여 GetVersion Shell32.dll 버전 6.0 이상인지 테스트하는 방법을 보여 줍니다.

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

프로젝트 버전

애플리케이션이 .dll 파일의 다른 대상 버전과 호환되도록 하기 위해 헤더 파일에 버전 매크로가 있습니다. 이러한 매크로는 다른 버전의 DLL에 대한 특정 정의를 정의, 제외 또는 재정의하는 데 사용됩니다. 이러한 매크로에 대한 자세한 설명은 Windows 헤더 사용을 참조하세요.

예를 들어, 매크로 이름 _WIN32_IE는 일반적으로 이전 헤더에서 발견됩니다. 매크로를 16진수로 정의해야 합니다. 이 버전 번호는 DLL을 사용하는 애플리케이션의 대상 버전을 정의합니다. 다음 표는 사용 가능한 버전 번호와 각 버전이 애플리케이션에 미치는 영향을 보여 줍니다.

버전 설명
0x0200 애플리케이션은 Shell32.dll 버전 4.00 이상과 호환됩니다. 애플리케이션은 버전 4.00 이후에 추가된 기능을 구현할 수 없습니다.
0x0300 애플리케이션은 Shell32.dll 버전 4.70 이상과 호환됩니다. 애플리케이션은 버전 4.70 이후에 추가된 기능을 구현할 수 없습니다.
0x0400 애플리케이션은 Shell32.dll 버전 4.71 이상과 호환됩니다. 애플리케이션은 버전 4.71 이후에 추가된 기능을 구현할 수 없습니다.
0x0401 애플리케이션은 Shell32.dll 버전 4.72 이상과 호환됩니다. 애플리케이션은 버전 4.72 이후에 추가된 기능을 구현할 수 없습니다.
0x0500 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 5.0 이상과 호환됩니다. 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 5.0 이후에 추가된 기능을 구현할 수 없습니다.
0x0501 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 5.0 이상과 호환됩니다. 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 5.0 이후에 추가된 기능을 구현할 수 없습니다.
0x0600 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 6.0 이상과 호환됩니다. 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 6.0 이후에 추가된 기능을 구현할 수 없습니다.

프로젝트에서 _WIN32_IE 매크로를 정의하지 않으면 자동으로 0x0500으로 정의됩니다. 다른 값을 정의하려면 make 파일의 컴파일러 지시문에 다음을 추가할 수 있습니다. 0x0400을 원하는 버전 번호로 대체합니다.

/D _WIN32_IE=0x0400

또 다른 방법은 Shell 헤더 파일을 포함하기 전에 소스 코드에 다음과 유사한 줄을 추가하는 것입니다. 0x0400을 원하는 버전 번호로 대체합니다.

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