셸 및 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는 해당 Internet 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 | Internet 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 | Internet Explorer 4.0. 참고 1을 참조하세요. |
4.72 | Internet Explorer 4.01 및 Windows 98. 참고 1을 참조하세요. |
4.7 | Internet 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: Internet Explorer 4.0 또는 4.01의 모든 시스템에는 연결된 버전의 Shlwapi.dll(각각 4.71 또는 4.72)가 있습니다. 그러나 Windows 98 이전 시스템의 경우 Internet Explorer 4.0 및 4.01을 통합 셸사용하거나 사용하지 않고 설치할 수 있습니다. Internet Explorer가 통합 셸과 함께 설치된 경우 연결된 버전의 Shell32.dll(4.71 또는 4.72)도 설치되었습니다. Internet Explorer가 통합 셸 없이 설치된 경우 Shell32.dll 버전 4.0으로 유지됩니다. 즉, 시스템에 Shlwapi.dll 버전 4.71 또는 4.72가 있다고 해서 Shell32.dll 버전 번호가 동일하지는 않습니다. 모든 Windows 98 시스템에는 Shell32.dll버전 4.72가 있습니다.
참고 2: 버전 5.0의 Shlwapi.dll Internet Explorer 5와 함께 배포되었으며 Windows 2000을 제외하고 Internet Explorer 5가 설치된 모든 시스템에서 발견되었습니다. Shell32.dll 버전 5.0은 기본적으로 Windows 2000 및 Windows Millennium Edition(Windows Me)과 함께 Shlwapi.dll버전 5.0과 함께 배포되었습니다.
DllGetVersion을 사용하여 버전 번호 확인
버전 4.71부터 셸 DLL은 DllGetVersion내보내기 시작했습니다. 이 함수는 애플리케이션에서 호출하여 시스템에 있는 DLL 버전을 확인할 수 있습니다.
Windows 2000 이전 버전의 경우 DllGetVersion 주 버전 및 부 버전 번호, 빌드 번호 및 플랫폼 ID를 포함하는 DLLVERSIONINFO 구조를 반환합니다. Windows 2000 이상 시스템의 경우 DllGetVersion 대신 DLLVERSIONINFO2 구조를 반환할 수 있습니다. DLLVERSIONINFO통해 제공되는 정보 외에도 DLLVERSIONINFO2최신 설치된 서비스 팩을 식별하는 핫픽스 번호를 제공하여 버전 번호를 보다 강력하게 비교할 수 있습니다. DLLVERSIONINFO2 첫 번째 멤버는 DLLVERSIONINFO 구조체이므로 이후 구조는 이전 버전과 호환됩니다.
DllGetVersion 사용
다음 샘플 함수는 지정된 DLL을 로드하고 DllGetVersion 함수를 호출하려고 시도하는 GetVersion
. 성공하면 매크로를 사용하여 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 버전 5.0 이후에 추가된 기능을 구현하고 Shlwapi.dll수 없습니다. |
0x0501 | 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 5.0 이상과 호환됩니다. 애플리케이션은 Shell32.dll 버전 5.0 이후에 추가된 기능을 구현하고 Shlwapi.dll수 없습니다. |
0x0600 | 애플리케이션은 Shell32.dll 및 Shlwapi.dll 버전 6.0 이상과 호환됩니다. 애플리케이션은 Shell32.dll 버전 6.0 이후에 추가된 기능을 구현하고 Shlwapi.dll수 없습니다. |
프로젝트에서 _WIN32_IE 매크로를 정의하지 않으면 자동으로 0x0500 정의됩니다. 다른 값을 정의하려면 메이크 파일의 컴파일러 지시문에 다음을 추가할 수 있습니다. 0x0400 원하는 버전 번호로 대체합니다.
/D _WIN32_IE=0x0400
또 다른 방법은 셸 헤더 파일을 포함하기 전에 소스 코드에서 다음과 유사한 줄을 추가하는 것입니다. 원하는 버전 번호를 0x0400 대체합니다.
#define _WIN32_IE 0x0400
#include <commctrl.h>