원본글 주소 : http://www.tipssoft.com/bulletin/tb.php/FAQ/216
* 이 자료를 퍼 가셔서 타사이트나 블로그에 게재 시 출처를 명시해 주시기 바랍니다.
  본 사이트에 게재된 모든 내용 및 자료는 상업적인 용도로 이용할 수 없습니다.
 
이 자료들은 저희 사이트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하시면 좀더 편리하게 볼수 있습니다.
알짜배기 프로그램 받기 :  http://www.tipssoft.com/bulletin/tb.php/QnA/8406
 
 
ExitWindowsEx 함수를 사용하여 컴퓨터를 종료, 재시작, 로그아웃 시키는 방법은 매우 간단합니다.
이 함수의 첫번째 인자에 아래 나열된 값중에서 원하는 값을 조합해서 명시만 해주면 되기 때문입니다.
 
1. EWX_LOGOFF        : 사용중인 프로그램을 종료하고 시스템을 LOG OFF 시킨다.
2. EWX_POWEROFF   : 시스템을 종료하고 전원을 끊다.
3. EWX_REBOOT       : 시스템을 종료시킨 후 시스템을 재시작 한다.
4. EWX_SHUTDOWN   : 사용자가 시스템의 전원을 끌 수 있도록 시스템을 종료한다.
5. EWX_FORCE          : 강제로 프로세스를 종료시킨다.
 
이 함수를 사용할때 주의해야할 점은 윈도우즈 NT 계열(Windows NT, Windows 2000, Windows XP..)의
운영체제에서는 종료를 위해서 ExitWindowEx 함수를 사용하는 프로세스가 SE_SHUTDOWN_NAME
이라는 권한을 가지고 있어야 하기 때문에 해당 권한을 얻는 기능을 추가해주여야 한다는 것입니다.
( 윈도우즈 98, Me와 같은 운영체제에서는 권한이 필요 없습니다. )
따라서 ExitWindowsEx 함수를 호출하기 전에 먼저 운영체제의 버전을 체크하는 코드가 있어야 합니다.
 
 
// 현재 응용프로그램이 실행되고 있는 윈도우즈의 버전을 반환하도록 작성된 함수입니다.
// ------------------------------------------------------------------------------
// [ 반환값 : 의미 ]
//   -1 : 버전얻기 실패, 1 : Windows 95,  2 : Windows 98,  3 : Windows ME,  4 : Windows NT,
//    5 : Windows 2000,  6 : Windows XP

char GetOSVersionType()
{
    // 계산된 윈도우즈 버전을 저장할 변수
    char version = -1;
    // 윈도우즈 버전에 관련된 정보를 얻어올 변수
    OSVERSIONINFOEX osvi;
    // OSVERSIONINFOEX 구조체 값을 얻었는지 OSVERSIONINFO 구조체값을 얻었는지를
    // 구분할 변수 ( 0 이면, OSVERSIONINFO 구조체 정보를 얻었다는 뜻입니다. )
    BOOL version_ex_flag = 0;

    // 운영체제의 버전과 관련된 정보를 얻기 위해 구조체 변수를 초기화합니다.
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    // 현재 운영체제의 버전을 알수 없기 때문에 OSVERSIONINFOEX 속성으로 버전정보를 얻습니다.
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 
    // GetVersionEx 함수를 사용하여 현재의 운영체제 정보를 얻습니다.
    // OSVERSIONINFOEX 값을 설정하고 호출했기 대문에 윈도우 NT 4.0 SP6 이상 및 그 이후 버전의
    //  윈도우가 아니라면 이 함수는 실패할 것입니다.
    if(!(version_ex_flag = GetVersionEx((OSVERSIONINFO *)&osvi))){
        // 윈도우즈 버전이 낮아서 OSVERSIONINFOEX 형식으로 값을 얻을수 없는 경우...
        // OSVERSIONINFO 형식으로 재설정하고 값을 얻습니다.
        osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
        if(!GetVersionEx((OSVERSIONINFO *)&osvi)) return -1;
    }
 
    // 얻어온 OSVERSIONINFOEX 구조체 변수의 값을 이용하여 버전을 구별합니다.
    switch(osvi.dwPlatformId){
        // NT 기술 기반의 운영체제인 경우
        case VER_PLATFORM_WIN32_NT:
            if(osvi.dwMajorVersion <= 4) version = 4;
            else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) version = 5;
            else if(version_ex_flag) version = 6;
            break;

        // 윈도우즈 9x 기반의 운영체제인 경우
        case VER_PLATFORM_WIN32_WINDOWS:
            if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) version = 1;
            else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) version = 2;
            else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) version = 3;
            break;
    }
 
    return version;
}
 
// 현재 운영체제가 NT 계열인 경우, SE_SHUTDOWN_NAME 레벨의 권한 등급을
// 가지고 있어야 하기 때문에 아래의 함수를 이용하여 권한을 얻습니다.
char GetNtPrivilege()
{
    HANDLE h_token;
    TOKEN_PRIVILEGES privilege_info;
 
    // 현재 프로세스의 권한과 관련된 정보를 변경하기 위해 토큰정보를 엽니다.
    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
                                                    TOKEN_QUERY, &h_token)){
        // 권한과 관련된 정보 접근에 실패함..
        return 0;
    }
 
    // 현재 프로세스가 SE_SHUTDOWN_NAME 권한을 사용할수 있도록 설정한다.
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &privilege_info.Privileges[0].Luid);
    privilege_info.PrivilegeCount = 1;
    privilege_info.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
    // 지정한 값으로 권한을 조정한다.
    AdjustTokenPrivileges(h_token, FALSE, &privilege_info, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    if(GetLastError() != ERROR_SUCCESS){
        // 권한 조정에 실패한 경우...
        return 0;
    }
 
    return 1;
}
 
// 컴퓨터를 끌때 사용할 함수
void PowerOff()
{
    if(GetOSVersionType()) <= 3{
        // 현재 운영체제가 Windows 95, Windows 98, Windows ME 인 경우...
        ExitWindowsEx(EWX_LOGOFF | EWX_POWEROFF | EWX_SHUTDOWN, 0);
        ExitWindowsEx(EWX_FORCE, 0);
    } else if(GetNtPrivilege()){
        // 현재 운영체제가 Windows NT, Windows 2000, Windows XP 인 경우...
        ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
    }
}
 

참좋은친구   08-08-21 17:28
위종료프로그램을 베이직으로만들려면 어뗗게코딩해야되는지요 베이직책에도 exitwindowsex함수로 종료시키는내용은 있는데 전혀안되더군요  아시는분은 베이직으로코딩해서 메일로보내주시면 5만원을 드리겟음니다 xp이고요 exitpro 와 아리를 쓰고있읍니다 즉 필요한것은종료시키는방법입니다
관리자   08-09-10 12:58
'ExitWindowsEx 를 사용하여 컴퓨터 종료하기' 예제가 있어 알려드립니다.

http://www.tipssoft.com/source/s_sub/sub_1/source1_9.html
관리자   09-02-16 14:24
위 예제코드에서 GetOSVersionType() 함수가 비스타 운영체제는 체크하지 못합니다. 따라서
비스타 운영체제를 체크하시려면 GetOSVersionType() 함수에서 스위치문 내용을 아래와 같이
수정하시면 됩니다.

    case VER_PLATFORM_WIN32_NT:
        if(osvi.dwMajorVersion <= 4) version = 4;
        else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) version = 5;
        else if(version_ex_flag){
            if(osvi.dwMajorVersion == 5) version = 6;  // XP
            else if(osvi.dwMajorVersion == 6) version = 7;  // 비스타...
        }
        break;

 

 

이글외의 관련글
윈도우즈 셧다운,리부팅,로그오프 관련 API 함수
.

'프로그래밍' 카테고리의 다른 글

D3DFont  (0) 2010.07.21
MFC 가 아닌경우 메모리 릭 검사  (0) 2010.06.25
템플릿 클래스 함수 포인터 배열 상속  (0) 2010.05.21
디자인 패턴 21종(23-2) 정리 .xlsx  (0) 2009.09.19
[MFC] DWORD GetTickCount(VOID)  (0) 2009.07.08