Develop				
			
										2013.04.23 15:45				
				[c++] Win32API를 이용한 ExitWindowsEx 사용한 예제코드
																																			조회 수 9313										댓글 0									
				
							필요하실 분도 있을 듯 해서 2001년도에 짰던 것 같네요.
윈도우즈2000 계열의 파워 끄는 소스코드입니다.
VC6.0으로 짰고, 프로그램을 하실 줄 아시면 뭐하는 것인 지 금방 아실 듯.
PwrTest.h
#if !defined(AFX_PWRTEST_H__149C02D0_B545_4699_A4A5_DFDB719EFBFB__INCLUDED_) #define AFX_PWRTEST_H__149C02D0_B545_4699_A4A5_DFDB719EFBFB__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "resource.h" /////////////// Jiseok int PowerOff(); int Reboot(); int GetWinVersion(OSVERSIONINFO* windowsversion); int DoPowerOff(OSVERSIONINFO* windowsversion); int DoReboot(OSVERSIONINFO* windowsversion); int AquirePrivileges(OSVERSIONINFO* windowsversion); ////////////// end Jiseok #endif //!defined(AFX_PWRTEST_H__149C02D0_B545_4699_A4A5_DFDB719EFBFB__INCLUDED_)
PwrTest.cpp
// PwrTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "PwrTest.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// The one and only application object
//
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        nRetCode = 1;
    }
    else
    {
        // TODO: code your application's behavior here.
        //if (PowerOff()!=0)
        if (Reboot()!=0)
            return 1;
        CString strHello;
        strHello.LoadString(IDS_HELLO);
        cout << (LPCTSTR)strHello << endl;
    }
    return nRetCode;
}
int PowerOff()
{
    OSVERSIONINFO Version;
    if (GetWinVersion(&Version)!=0)
        return -1;
    if (DoPowerOff(&Version)!=0)
        return -1;
    return 0;
}
int Reboot()
{
    OSVERSIONINFO Version;
    if (GetWinVersion(&Version)!=0)
        return -1;
    if (DoReboot(&Version)!=0)
        return -1;
    return 0;
}
int GetWinVersion(OSVERSIONINFO* windowsversion)
{
    windowsversion->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    if (!GetVersionEx(windowsversion))
    {
        printf("Error! getting version info");
        return -1;
    }
    return 0;
}
int DoPowerOff(OSVERSIONINFO* windowsversion)
{
    UINT mode;
    if (windowsversion->dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
        mode=EWX_SHUTDOWN;
    else
        mode=EWX_POWEROFF;
    if (windowsversion->dwPlatformId==VER_PLATFORM_WIN32_NT)
        {
        // privilege 얻기
        if (AquirePrivileges(windowsversion)!=0)
        {
            return -1;
        }//if 
    }// if
  
    if (!ExitWindowsEx(mode,0))    // 끄기
    {
        printf("error ExitWindowsEx");
        return -1;
    }
    return 0;
}
      
int DoReboot(OSVERSIONINFO* windowsversion)
{
    UINT mode;
    mode=EWX_REBOOT;
    if (windowsversion->dwPlatformId==VER_PLATFORM_WIN32_NT)
        {
        // privilege 얻기
        if (AquirePrivileges(windowsversion)!=0)
        {
            return -1;
        }//if 
    }// if
  
    if (!ExitWindowsEx(mode,0))    // 끄기
    {
        printf("error ExitWindowsEx");
        return -1;
    }
    return 0;
}
int AquirePrivileges(OSVERSIONINFO* windowsversion)
{
    HANDLE current_thread,token;
    TOKEN_PRIVILEGES privs;
    LUID luid;
    current_thread=GetCurrentProcess();
    if (!OpenProcessToken(current_thread,TOKEN_ADJUST_PRIVILEGES,&token))
    {
        printf("Error! opening process token");
        return -1;
    }
    if (!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid))
    {
        printf("Error! looking up privilege");
        return -1;
    }
    privs.PrivilegeCount=1;
    privs.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    privs.Privileges[0].Luid=luid;
    if (!AdjustTokenPrivileges(token,FALSE,&privs,0,NULL,NULL))
    {
        printf("Error! getting privileges");
        return -1;
    }
    return 0;
}[출처] http://kldp.org/node/28417
| 번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 | 
|---|---|---|---|---|---|
| 541 | Develop | [c] 가변인자 함수(printf와 같은..) | hooni | 2013.04.23 | 8415 | 
| 540 | Develop | 
				
								
					[c#] BHO 한샘툴바랑 동현툴바..				
																								 | 
																																										hooni | 2013.04.23 | 2208 | 
| » | Develop | [c++] Win32API를 이용한 ExitWindowsEx 사용한 예제코드 | hooni | 2013.04.23 | 9313 | 
| 538 | Develop | 
				
								
					[c#] mfc 기반의 웹서비스 서버/클라이언트 샘플과 예제 소스				
																								 | 
																																										hooni | 2013.04.23 | 2073 | 
| 537 | Develop | 
				
								
					[c] 텍스트 파일(로그)을 정해진 라인 단위로 쪼개주는 코드				
																								 | 
																																										hooni | 2013.04.23 | 8726 | 
| 536 | Develop | 
				
								
					[c] 네트워크 트래릭 모니터링.. 졸업작품..				
												2												 | 
																																										hooni | 2013.04.23 | 13402 | 
| 535 | Develop | 
				
								
					[c#] MS IE(Internet Explorer) 툴바 버튼 예제 2003/2005 두가지 버전				
																								 | 
																																										hooni | 2013.04.23 | 2090 | 
| 534 | Develop | 
				
								
					[c#] BFilter 툴바 소스 코드 ㅎㅎ				
																								 | 
																																										hooni | 2013.04.23 | 8746 | 
| 533 | Develop | 
				
								
					[c++] mfc로 만든 현재 디렉토리 읽어오기/세팅하기 (GetCurrentDirectory/SetCurrentDirectory)				
																								 | 
																																										hooni | 2013.04.23 | 9493 | 
| 532 | Develop | 다운 받아서 테스트 해볼것.. | hooni | 2013.04.23 | 10291 | 
| 531 | Develop | 
				
								
					[c++] mfc 기반 멀티수납(wall)시스템 소스와 실행파일				
																								 | 
																																										hooni | 2013.04.23 | 8398 | 
| 530 | Develop | [c++] mfc 기반 레지스트리(registry) 컨트롤 예제 코드 2 | hooni | 2013.04.23 | 17192 |