개발메모(형식에 매이지 않는 짤막한 개발 낙서)

Windows Shutdown하는 방법

조회 수 3251 추천 수 0 2005.03.14 14:01:02
김충영 *.81.92.231
가끔 프로그램에서 원도우즈를 종료하거나 재부팅하는 기능이 필요한 경우가 있는데 CVI자체에는 그런기능이 없습니다. 그럴경우에는 할수없이 SDK함수를 이용하여 기능을 구현하는수 밖에 없습니다.
밑에 프로그램은 SDK도움말에 나오는 예를 참고 한것입니다.

원도우즈 종료기능은 로그오프,Shutdown,Power Off,Reboot 등 4가지 모드가 있는데 모두 ExitWindowsEx 함수를 사용합니다.

로그오프 모드는 ExitWindows 함수를 사용하며 내부적으로 ExitWindowEx 함수에 EWX_LOGOFF값을 지정해서 사용합니다. 헤더파일에 보면
#define ExitWindows(a,b) ExitWindowsEx(EWX_LOGOFF,0)로 되어있죠.

나머지는 ExitWindowsEx 함수의 Shutdown,Power Off,Reboot의 기능인데요, 이 기능들은 호출하는 프로세스가 SE_SHUTDOWN_NAME Privilege를 가져야 된다고 되어있습니다. 실제로 이걸안하고 그냥 호출하면 로그오프만 됩니다.

아래 함수에서는 로그오프,Power Off, Reboot기능만 사용하고 Shutdown기능은 거의 사용하지 않기때문에 포함하지 않았습니다.

Parameter값 설명
bLogOff - 로그오프할경우 TRUE 값이 사용되면 다른경우에는 FALSE 이어야 합니다.
bReboot - bLogOff 값이 FALSE 이어야 되며 이값이 TRUE 이면 재부팅을 하고 FALSE 이면 Power Off가 됩니다.
bForce - 이 값은 현재 실행되고 있는 응용프로그램을 강제로 종료할것인지 선택하는 역활을 합니다.

* 이 함수는 2000 이나 XP에서는 잘 작동합니다. 다른 OS는 테스트를 안해봐서 모르겠습니다.
* CVI에서 사용할경우에는 windows.h 파일은 include시켜야 됩니다.

int ShutdownWindows (BOOL bLogOff, BOOL bReboot, BOOL bForce)
{
        if (bLogOff==TRUE) {
                return ExitWindows (0, 0);
        }
        else {                
                HANDLE hToken;
                TOKEN_PRIVILEGES tkpNew, tkpOld;
                LUID luid;
                DWORD dwSize = sizeof (TOKEN_PRIVILEGES);
                BOOL bWorkFlag;
                
                if (!OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
                        return FALSE;
                
                if (!LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &luid))
                        return FALSE;
                tkpNew.PrivilegeCount = 1;
                tkpNew.Privileges[0].Luid = luid;
                tkpNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                if (!AdjustTokenPrivileges (hToken, FALSE, &tkpNew, dwSize, &tkpOld, &dwSize))
                        return FALSE;                
                CloseHandle (hToken);
                
                bWorkFlag = (bReboot==TRUE) ? EWX_REBOOT : EWX_POWEROFF;
                if (bForce==TRUE)
                        bWorkFlag |= EWX_FORCE;
                return ExitWindowsEx (bWorkFlag, 0);
        }
}
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
113 DAQmx 장치의 Device Serial Number 얻어오기 허창원 2006-12-18 3478
112 32비트 환경에서 시간함수의 표현가능 년도는 대략 2036~2038년까지 허창원 2005-04-13 3450
111 windef.h 파일에 선언된 내용 일부 허창원 2005-09-29 3439
110 [메모] Dev1/ai0:8 이런 문자열에서 채널수를 뽑아내는 처리 허창원 2008-08-03 3397
109 자주 쓰는 타이머(Timer) 컨트롤 Setting 문장 허창원 2005-01-29 3389
108 [Doc] Accessing Parallel Ports with VISA 허창원 2007-06-15 3381
107 구간을 Linear/Log scale로 등분하고자 할 때 허창원 2005-12-27 3356
106 Password 컨트롤 사용법 메모 허창원 2005-08-30 3345
105 현재 날짜,시간 정보를 이용한 기본 데이터 파일명 구성하기 허창원 2004-12-30 3345
104 TCP 연결이 되었다가 바로 끊어질 때 file 허창원 2008-07-05 3344
103 테이블의 전체 셀을 스캔하며 해당 값을 얻는 콜백함수 예 허창원 2004-12-29 3342
102 테이블의 셀에 이미지를 표시하는 과정 요약 허창원 2007-09-01 3338
101 Reading/Writing .ini-Style files Help 허창원 2005-01-26 3316
100 Cannot find icon file. 이라는 에러메시지 허창원 2005-07-23 3315
99 프로그램 종료시에 파일 저장여부, 종료여부 물어보는 예 허창원 2004-12-30 3306
98 Noisy Sine Wave 데이터 만들기 허창원 2005-11-24 3297
97 클립보드에 문자열 복사하기/가져오기 허창원 2006-01-09 3295
96 테이블 콜백의 간단한 예 허창원 2004-12-29 3290
95 수신된 문자열을 16진수로 스트링 컨트롤에 출력하는 예 허창원 2005-01-11 3289
94 Thread 사용 순서 간단 요약 허창원 2012-11-22 3272