수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620654
  • Today | 34
  • Yesterday | 482

Programming/Win32 API2007/01/02 15:59

XP 프로그램 호환성 정보 얻기

고수닷넷 - 데미소다오렌지님

1. Introduction

Windows XP 부터 프로그램 호환성이라는 항목이 새로 생겼습니다. 프로그램의 등록 정보에서 설정할 수 있는 기능으로 해당 프로그램의 호환성을 체크할 수 있습니다. Windows 95, 98, NT4 Sp5, Win2000등으로 호환성을 설정할 수 있으며, 호환성 체크를 제거할 수 있습니다.

호환성 체크를 단순히 그런 기능이 있구나 하고 넘어가신다면 큰 오산입니다. 해당 기능이 체크될 경우 각종 API들의 기능이 변경됩니다. 만약 Windows 95 호환성을 체크했다면 GetVersion API는 95에 해당하는 버전을 리턴할 것 입니다. 따라서 XP상에서 동작함에도 잘못된 정보를 인지할 수 있다는 문제점이 있습니다. 물론 잘못된 호환성 체크를 한 것은 사용자의 실수지만, 이러한 것들을 프로그램에서 판단해서 알려주면 좀 더 잘 만들어진 프로그램이라는 인상을 사용자에게 심어줄 수 있을 겁니다.

2장에서 프로그램 호환성에 대한 좀 더 상세한 정보를 알아보도록 하겠습니다.

2. Behind the scene

프로그램 호환성 정보는 레지스트리에 저장됩니다. 저장되는 경로는 아래와 위치입니다.

HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

위 경로에 가 보면 호환성이 체크된 프로그램의 경우에는 해당 실행 파일 경로가 키값으로 존재하는 것을 볼 수 있습니다. 체크 상태와 매칭되는 값들은 다음과 같습니다.

  • Windows 95 - "Win95"
  • Windows 98 - "Win98"
  • Windows NT4 Sp5 - "WinNT4SP5"
  • Windows 2000 - "Win2000"

여기까지가 호환성과 관계된 전부입니다. 호환성을 체크하고 싶은 경우 해당 경로에 값을 남겨주면 됩니다. 제거하고 싶은 경우에는 해당 키를 제거하면 되죠.

그리고 잊지 말아야 할 중요한 점은 정확한 OS 버전을 체크해야 한다는 점 입니다. 1장에서도 언급했듯이, 이 기능은 XP이상에서 지원하는 기능이며 체크될 경우 GetVersion으로 버전 판단을 하게 되면 잘못된 버전을 리턴합니다. 그럼 어떻게 버전을 판단해야 할까요? 답은 VerifyVersion API입니다. VerifyVersion의 경우 호환성 체크를 하더라도 정상적으로 동작합니다.

3. Codes

아래는 프로그램의 호환성 모드를 구하고 설정하는 간단한 두가지 함수입니다. 각각 프로그램 경로와 APPCOMPATTYPE 값을 넣어주면 해당 값으로 설정되고 구해옵니다.

typedef enum _APPCOMPATTYPE
{
        actNone = -1,
        actWin95,
        actWin98,
        actWinNT4SP5,
        actWin2000
} APPCOMPATTYPE, *PAPPCOMPATTYPE;

APPCOMPATTYPE GetAppCompatLayer(LPCTSTR szFileName)
{
        HKEY    hKey;
        LPCTSTR szRegAppCompatLayerKey = 
                "Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers";
        
        APPCOMPATTYPE   actRet = actNone;
        LPCTSTR         szActName[5] = {"Win95", "Win98", "WinNT4SP5", "Win2000", NULL};
        
        if(IsWinXP() && 
           RegOpenKey(HKEY_CURRENT_USER, szRegAppCompatLayerKey, &hKey) == ERROR_SUCCESS)
        {
                TCHAR   szCompatType[MAX_PATH] = {0};
                DWORD   dwType;
                DWORD   dwSize = sizeof szCompatType;
                if(RegQueryValueEx(hKey, szFileName, NULL, &dwType, 
                   (LPBYTE) szCompatType, &dwSize) == ERROR_SUCCESS)
                {
                        for(int i=0; szActName[i] != NULL; ++i)
                        {
                                if(stricmp(szCompatType, szActName[i]) == 0)
                                {
                                        actRet = (APPCOMPATTYPE) i;
                                        break;
                                }
                        }
                }
                
                RegCloseKey(hKey);
        }
        
        return actRet;
}

BOOL SetAppCompatLayer(LPCTSTR szFileName, APPCOMPATTYPE actNewType)
{
        HKEY    hKey;
        LPCTSTR szRegAppCompatLayerKey = 
                "Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers";
        
        BOOL    bRet = FALSE;
        LPCTSTR szActName[6] = {"", "Win95", "Win98", "WinNT4SP5", "Win2000", NULL};
        
        if(IsWinXP() && 
           RegOpenKey(HKEY_CURRENT_USER, szRegAppCompatLayerKey, &hKey) == ERROR_SUCCESS)
        {
                TCHAR   szNewType[MAX_PATH] = {0};

                strcpy(szNewType, szActName[actNewType+1]);
        
                if(strcmp(szNewType, "") == 0)
                {
                        if(RegDeleteValue(hKey, szFileName) == ERROR_SUCCESS)
                                bRet = TRUE;
                }
                else
                {
                        if(RegSetValueEx(hKey, szFileName, 0, REG_SZ, (LPBYTE) szNewType, 
                           strlen(szNewType)+1) == ERROR_SUCCESS)
                                bRet = TRUE;                    
                }
                
                RegCloseKey(hKey);
        }
        
        return bRet;
}
"Win32 API" 카테고리의 다른 글
  • 작업관리자에 표시되는 응용프로그램 열거하기 (0)2007/01/02
  • 트레이로 내려가는 애니메이션 출력 (0)2007/01/02
  • XP 프로그램 호환성 정보 얻기 (0)2007/01/02
  • PE 포맷 분석3 (0)2007/01/02
  • PE 포맷 분석2 (0)2007/01/02
2007/01/02 15:59 2007/01/02 15:59
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2540

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 692 693 694 695 696 697 698 699 700 ... 2998  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 감성정보
  • JPEG
  • 리눅스
  • GetProcAddress
  • Music
  • breakpoint
  • 색상
  • INI 파일
  • SQL Server 2000
  • DFS
  • renfe
  • 4대륙
  • Tab
  • 율곡관
  • 나눔고딕 코딩
  • robots
  • malloc
  • CreateProcess()
  • 프로그래머의 조건
  • 식당동

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.