괴짜 프로그래머의 일상사~@@
프로그래밍, 컴퓨터, 그리고 일상에 관한 소소한 이야기들...
Blog | Guestbook
Keyword | Local | Tag
T 132 / Y 700 / Total 3405190
Catergories
Calendar
«   2023/06   »
        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  
Tag
freakonomics, 진리, 서평왕, 한비야, 프로그래머, 7월호, 올드미스다이어리, 오류, 계획, 리맵핑, 양병규, 우리들의 행복한 시간, 독후감, 숨겨진 기능, 도서, 재테크에 미쳐라, 스페이스 니들, 워드, 므웸바 리차드, S2110,
Archive
Link
Search
  submit
Recent Articles
Recent Comments
Recent Trackbacks
2007/08/29 18:46
운영체제 버전 구하기
[GGG]
정확한 OS 종류를 판단하는 것은 무척 중요한 일 입니다. 이 문서에 포함된 함수들은 VerifyVersion과 GetVersionEx함수를 사용하여 정확한 OS 종류를 판단합니다. 제공되는 함수는 아래와 같습니다. 각각의 함수가 판별하는 OS는 주석을 참고 하십시요.
[CPP]BOOL WINAPI IsWin95()          // 윈도우 95
BOOL WINAPI IsWin95OSR2() // 윈도우 95 OSR2
BOOL WINAPI IsWin98() // 윈도우 98
BOOL WINAPI IsWin98SE() // 윈도우 98 SE
BOOL WINAPI IsWinME() // 윈도우 ME
BOOL WINAPI IsWin9X() // 모든 윈도우 9x 시스템
BOOL WINAPI IsWinNT4() // 윈도우 NT4
BOOL WINAPI IsWin2K() // 윈도우 2000
BOOL WINAPI IsWinXP() // 윈도우 XP
BOOL WINAPI IsWinNET() // 윈도우 .Net
BOOL WINAPI IsWinNT() // 모든 윈도우 NT계열 시스템[/CPP]
[CPP]#ifndef GETPROC
#define GETPROC(dll, type, name) (type)GetProcAddress(dll, name)
#endif

typedef BOOL
(WINAPI *fnVerifyVersionInfo)(LPOSVERSIONINFOEX, DWORD, DWORDLONG);

typedef ULONGLONG
(WINAPI *fnVerSetConditionMask)(ULONGLONG, DWORD, BYTE);

BOOL _VerifyVersionInfo(LPOSVERSIONINFOEX lpVersionInfo
                        , DWORD dwTypeMask
                        , DWORDLONG dwConditionMask
                        , BOOL *bVerified)
{
    BOOL bRet = FALSE;
    HINSTANCE hDll = NULL;
    fnVerifyVersionInfo FVerifyVersionInfo;
    fnVerSetConditionMask FVerSetConditionMask;

    hDll = LoadLibrary("kernel32.dll");
    if(hDll != NULL)
    {
        FVerifyVersionInfo = GETPROC(hDll
                                    , fnVerifyVersionInfo
                                    , "VerifyVersionInfoA");

        FVerSetConditionMask = GETPROC(hDll
                                    , fnVerSetConditionMask
                                    , "VerSetConditionMask");

        if(FVerifyVersionInfo != NULL && FVerSetConditionMask != NULL)
        {
            dwConditionMask = 0;
            if(dwTypeMask & VER_MAJORVERSION)
                dwConditionMask = FVerSetConditionMask(dwConditionMask
                                                    , VER_MAJORVERSION
                                                    , VER_EQUAL);

            if(dwTypeMask & VER_MINORVERSION)
                dwConditionMask = FVerSetConditionMask(dwConditionMask
                                                    , VER_MINORVERSION
                                                    , VER_EQUAL);

            if(dwTypeMask & VER_PLATFORMID)
                dwConditionMask = FVerSetConditionMask(dwConditionMask
                                                    , VER_PLATFORMID
                                                    , VER_EQUAL);

            if(dwTypeMask & VER_PRODUCT_TYPE)
                dwConditionMask = FVerSetConditionMask(dwConditionMask
                                                        , VER_PRODUCT_TYPE
                                                        , VER_EQUAL);


            *bVerified = FVerifyVersionInfo(lpVersionInfo
                                            , dwTypeMask
                                            , dwConditionMask);
            bRet = TRUE;
        }
        FreeLibrary(hDll);
    }

    return bRet;
}

BOOL WINAPI IsWin95()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 4;
    osi.dwMinorVersion = 0;
    osi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;

    bRet = _VerifyVersionInfo(&osi
                        , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                        , dwlConditionMask
                        , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }

    return (osi.dwMajorVersion == 4)
            && (osi.dwMinorVersion == 0)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
            && (osi.szCSDVersion[1] != 'C');
}

BOOL WINAPI IsWin95OSR2()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 4;
    osi.dwMinorVersion = 0;
    osi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;

    bRet = _VerifyVersionInfo(&osi
                                , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                                , dwlConditionMask
                                , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return (osi.dwMajorVersion == 4)
            && (osi.dwMinorVersion == 0)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
            && (osi.szCSDVersion[1] == 'C');
}

BOOL WINAPI IsWin98()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 4;
    osi.dwMinorVersion = 10;
    osi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;

    bRet = _VerifyVersionInfo(&osi
                            , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                            , dwlConditionMask
                            , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return (osi.dwMajorVersion == 4)
            && (osi.dwMinorVersion == 10)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
            && (osi.szCSDVersion[1] != 'A');
}

BOOL WINAPI IsWin98SE()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 4;
    osi.dwMinorVersion = 10;
    osi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;

    bRet = _VerifyVersionInfo(&osi
                            , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                            , dwlConditionMask
                            , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return (osi.dwMajorVersion == 4)
            && (osi.dwMinorVersion == 10)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
            && (osi.szCSDVersion[1] == 'A');
}

BOOL WINAPI IsWinME()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 4;
    osi.dwMinorVersion = 90;
    osi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;

    bRet = _VerifyVersionInfo(&osi
                            , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                            , dwlConditionMask
                            , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       

    return (osi.dwMajorVersion == 4)
            && (osi.dwMinorVersion == 90)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
}

BOOL WINAPI IsWin9X()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;

    bRet = _VerifyVersionInfo(&osi, VER_PLATFORMID, dwlConditionMask, &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       

    return osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS;
}

BOOL WINAPI IsWinNT4()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 4;
    osi.dwMinorVersion = 0;
    osi.dwPlatformId = VER_PLATFORM_WIN32_NT;

    bRet = _VerifyVersionInfo(&osi
                        , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                        , dwlConditionMask
                        , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return (osi.dwMajorVersion == 4)
            && (osi.dwMinorVersion == 0)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_NT);
}

BOOL WINAPI IsWin2K()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 5;
    osi.dwMinorVersion = 0;
    osi.dwPlatformId = VER_PLATFORM_WIN32_NT;

    bRet = _VerifyVersionInfo(&osi
                        , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                        , dwlConditionMask
                        , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return (osi.dwMajorVersion == 5)
            && (osi.dwMinorVersion == 0)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_NT);
}

BOOL WINAPI IsWinXP()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 5;
    osi.dwMinorVersion = 1;
    osi.dwPlatformId = VER_PLATFORM_WIN32_NT;

    bRet = _VerifyVersionInfo(&osi
                        , VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID
                        , dwlConditionMask
                        , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return  (osi.dwMajorVersion == 5)
            && (osi.dwMinorVersion == 1)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_NT)
            && (osi.wProductType == VER_NT_WORKSTATION);
}

BOOL WINAPI IsWinNET()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwMajorVersion = 5;
    osi.dwMinorVersion = 1;
    osi.wProductType = VER_NT_WORKSTATION;
    osi.dwPlatformId = VER_PLATFORM_WIN32_NT;

    DWORD type = VER_MAJORVERSION
                | VER_MINORVERSION
                | VER_PRODUCT_TYPE
                | VER_PLATFORMID;

    bRet = _VerifyVersionInfo(&osi, type, dwlConditionMask, &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       
    
    return (osi.dwMajorVersion == 5)
            && (osi.dwMinorVersion == 1)
            && (osi.dwPlatformId == VER_PLATFORM_WIN32_NT)
            && (osi.wProductType != VER_NT_WORKSTATION);
}

BOOL WINAPI IsWinNT()
{
    OSVERSIONINFOEX osi;
    DWORDLONG dwlConditionMask = 0;
    BOOL bRet = FALSE;
    BOOL bVerified = FALSE;

    ZeroMemory(&osi, sizeof(OSVERSIONINFOEX));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    osi.dwPlatformId = VER_PLATFORM_WIN32_NT;

    bRet = _VerifyVersionInfo(&osi
                            , VER_PLATFORMID
                            , dwlConditionMask
                            , &bVerified);
    if(bRet == TRUE)
        return bVerified;

    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
    {
        osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if(GetVersionEx((OSVERSIONINFO *) &osi) == 0)
            return 0;
    }       

    return osi.dwPlatformId == VER_PLATFORM_WIN32_NT;
}[/CPP]
Trackback : http://jiniya.net/tt/trackback/580
chaoskcuf (2007/08/29 18:56)
C#에서는

OperatingSystem os = Environment.OSVersion;
if (os.Version.Major >= 6)
; // Vista

이거면 끝나는데.. 좀 길어보이네요. ^^;
codewiz (2007/08/29 20:37)
C++에서도 GetVersion 하나면 버전을 구해올 수 있습니다.
단지 XP부터 생긴 호환성 모드에 상관없이 정확하게 구하려다보니 코드가 길어진거죠. ㅠㅠ 호환성모드는 아래 페이지를 참고하세요.

http://www.jiniya.net/tt/25

그리고 좀 더 고급언어로 갈 수록 코드 줄수가 짧아지는 것은 당연한 결과입니다. 길어진다면 사람들이 쓸 이유가 없겠죠. 파이썬의 한 줄이 C/C++의 수십, 수백 줄이 되는 경우는 흔하죠. 단지 프로그래머는 그 작업을 하지 않았지만 하부에서는 똑같은 일들이 벌어지고 있죠. 누가 하느냐의 차이죠. 위의 저걸 라이브러리로 만들고 IsWinNT() 하나만 호출하면 끝난다라고 하는 것과 차이가 없다는 이야기 입니다.

drvoss (2007/08/30 01:40)
커널에 모듈을 심어 놓고 유저모드와 프로세스 통신 하는 프로그램이 있다면, 호환성 모드는 경우에 따라서 오동작의 원인이 될 수도 있겠네요. 사용자들은 자신이 호환성 모드를 켜 놓았는지 잘 모르는 경우가 있더라구요. 그럴때 생기는 버그라면 버그 리포팅이 들어오더라도, 상황에 대한 추측을 오해해서 버그 수정이 어려울 수도 있을것 같습니다. 단순히 GetVersion으로 비교만 하고 그밖의 상황은 무시했던 버전 체크를 다시한번 돌아 보게 만드는 좋은글이였습니다. 영진님은 이런 내용이 막 머리에서 샘솟나봐요. 부럽습니다.~

그건 그렇고 호환성모드관련 글에 답글 BB를 보고 까무러 칠뻔했습니다. ㅎㅎㅎ
codewiz (2007/08/30 10:16)
네 맞습니다.
일전에 게임에 적용되는 모듈을 개발한적이 있는데, XP시스템인데 자꾸 VxD를 로딩하더군요. 알아보니 그 게임의 경우 XP 시스템에서 98 호환성모드로 동작하기를 권고하고 있더군요. 결국은 호환성 모드를 끄는 쪽으로 해결했지만 호환성 모드가 쉽게 생각하는 것 만큼 간단한게 아니더군요. 버전 외에도 바뀌는게 많은 것 같았습니다. 성환호위하 티가 괜히 있는게 아닌것 같더군요 ㅎㅎㅎ

그리고 이 글은 예전에 고수닷넷에 포스팅한 글인데 방명록에 어느 분이 질문하셔서 다시 퍼온 것 입니다. 고수닷넷에 올려진 글이 인덴트가 심하게 깨져서 알아보기가 힘들더라고요. *^^*


이광진 (2007/08/31 00:00)
예전에 저는 각 OS에 대해서 int 형의 값을 define 해 두고 함수 하나 만들어서 각 상황에 맞게 미리 define 된 값을 반환시키도록 해서 구현을 했었는데...
codewiz (2007/08/31 12:28)
광진님 안녕하세요. ^^ 잘지내시죵??
방법을 조금 더 자세히 소개해 주실 수 있을까요?
잘 이해가 안되서요. ㅎㅎ

salt lake city welding (2021/11/29 23:12)
I really loved it here but are there any recent updates? Thanks

Name   Password   Home   Secret   Submit
 Prev   1  ...  140   141   142   143   144   145   146   147   148  ...  604   Next 
codewiz’s Blog is powered by Tattertools.com / Designed by faido