'Programmings/Windows Programming'에 해당되는 글 35건

  1. 2008.10.01 노트북의 배터리 정보를 받아오자
  2. 2008.09.22 error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR'
  3. 2008.09.19 하드디스크 용량 가져오기
  4. 2008.09.19 윈도우를 투명하게!!! 1
  5. 2008.09.11 Windows Power Scheme Management APIs
  6. 2008.09.11 Windows Power Management Structures
  7. 2008.09.08 VS2005 응용프로그램 에러.. "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다..." 3
  8. 2008.09.06 전원 상태를 알아오는 SYSTEM_POWER_STATUS struct
  9. 2008.09.05 Windows Power management API - PBT_APMPOWERSTATUSCHANGE Event 1
  10. 2008.08.20 GetCurrentDirectory()를 이용한 Windows에서 현재경로 받아오기.. 1
2008. 10. 1. 12:03

노트북의 배터리 정보를 받아오자


10월의 첫날부터... 이런 상투적인 업무 포스트밖에 올릴 것이 없다는게 참 슬프긴 하지만.. 그리도.. 머.. -_-;;

노트북의 배터리의 정보를 받아오는 부분에 대해서 뭔가를 하고 있다. 배터리의 용량, Voltage, 상태... 뭐 그밖의 등등..  검색을 하던중.. 좋은 정보를 얻어 포스팅 한다.
MSDN에서 검색을 했는데 'Enumerating Battery Devices'라고 꽤 쓸만한 예제 소스가 있었다.
여기(http://msdn.microsoft.com/en-us/library/bb204769(VS.85).aspx )를 클릭하면 정보를 얻을 수 있다.

이녀석을 바로 적용하면 동작하지는 않고 몇가지 수정을 해주어야 한다.
VS2005환경에서 Win32 API를 이용하여 테스트 프로그램을 작성하였다.

일단 필요한 헤더 파일('BatClass.h', 'Setupapi.h')을 적당한 위치에 넣어(#include)준다.
BatClass.h는 배터리에 관련된 것들을 정의해 놓은 헤더파일이고, Setupapi.h는 'SetupDiGetClassDevs', 'SetupDiEnumDeviceInterfaces', .. 등과 같은 함수들을 정의해 놓은 헤더파일이다.

헤더파일을 추가하고 컴파일을 하게 되면 에러가 뜰것이다. 안뜰지도 모르지만.. 본인의 경우에는 에러가 있었다.
HDEVINFO hdev = SetupDiGetClassDevs(&GUID_DEVCLASS_BATTERY, 0, 0, DIGCF_PRESENT |                                                                DIGCF_DEVICEINTERFACE);
위의 위치에서 'GUID_DEVCLASS_BATTERY' 라는 녀석이 정의되지 않아 찾을 수 없다고...

BatClass.h라는 파일을 찾아서 열어본다.
이런 저런 코드들이 보일텐데.. GUID_DEVCLASS_BATTERY를 검색해보면 없을 거이다. GUID_DEVCLASS_BATTERY를 추가시켜주어야 한다.
코드를 대충 보면 비슷한 녀석들이 모여있는 곳이 있다. 그곳에 다음을 넣어준다.
...
DEFINE_GUID( GUID_DEVCLASS_BATTERY,
                      0x72631E54, 0x78A4, 0x11D0, 0xBC, 0xF7, 0x00, 0xAA, 0x00, 0xB7, 0xB3, 0x2A);
...

구글에서 검색하다 찾았는데.. 위의 문장이 정의된 GUID_DEVCLASS_BATTERY 의 값인듯 하다.

이렇게 수정을 하고 컴파일을 다시 하면, 정상적으로 빌드가 될 것이고, 추가로 필요한 배터리의 정보는 소스의 내용을 수정해서 얻을 수 있을 것이다.

소스는 분석을 해봐야 더 정확한 것을 알 수 있을 듯한데.. 배터리 뿐만 아니라 여러 디바이스 드라이버의 정보를얻을 때에도 유용하게 쓰이는 듯 보인다.



2008. 9. 22. 10:34

error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR'


VS2005를 사용하면서 'error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [9]' to 'LPCWSTR''라는 에러 메시지를 종종 보게 된다.

CreateFile()라는 함수를 사용할 때 첫번째 인자의 형식이 잘못된듯한데.. 지금 사용하고 있는 CreateFile()라는 녀석을 보면 CreateFile("aaa.txt",GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)로 문자열을 처리하는 부분이다.
"aaa.txt"라는 문자열을 사용하고 있었는데.. 이를 TEXT("aaa.txt")라든지 L"aaa.txt"로 바꾸어주면 에러가 발생하지 않는다.

하지만.. 다른 문제가 발생해 버렸다. 메지시 박스로 테스트 문자열을 출력하는데 다음과 같이 문자열이 깨져나오는 현상이 발생을 한 것이다.

이 부분을 해결하기 위해서는 문자 집합(Character Set)의 설정을 바꾸어 주어야 하는 모양이다.
VS2005의 메뉴에서 Project->Properties...(Alt+F7)을 선택하여 해당 프로젝트의 프로퍼티 창을 연다. 왼쪽의 항목을 보여주는 창에서 Configuration Properties의 General에서 Character Set 항목을 살펴본다. 기본적으로 VS2005에서는 Character Set이 'Use Unicode Character Set'으로 되어 있는 듯 하다. 이녀석의 세팅을 'Use Multi-Byte Character Set'으로 수정을 한다.

다시 컴파일을 한 뒤 실행을 시키면 원하는 결과를 얻을 수 있을 것이다.

한결 보기 좋아졌다... 아니 많이 보기 좋아졌네..

간단한 것인데.. 툴에 대해 모르는 것이 너무 많아 고생을 많이 하는 부분중에 하나인 듯 하다.

2008. 9. 19. 19:05

하드디스크 용량 가져오기


GetDiskFreeSpaceEx() 라는 함수가 하드디스크의 총 용량, 사용 용량, 남은 용량을 가져오는 함수이다.

MSDN을 살펴보면 다음과 같이 함수가 정의되어 있다.
BOOL WINAPI GetDiskFreeSpaceEx(
  __in LPCTSTR lpDirectoryName,
  __out PULARGE_INTEGER lpFreeBytesAvailable,
  __out PULARGE_INTEGER lpTotalNumberOfByte,
  __out PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

사용법은 직관적으로 함수의 인자를 보면 알 수 있을 것이다.
첫 번째 인자에 원하는 파티션의 경로(c:\, d:\ 등의)를 넣어준다. 그러면 나머지 인자에서 원하는 정보를 얻을 수 있다.

간단한 예제를 가지고 사용하는 방법을 알아본다. 나중에 필요할 때 대충 참고할 요령으로.. ^^;

ULARGE_INTEGER avail, total, free;
avail.QuadPart = 0L;
total.QuadPart = 0L;
free.QuadPart = 0L;
int m_avail, m_total, m_free;
TCHAR buf[125];

// C:\의 하드디스크 용량 정보를 받아올 것이다.
GetDiskFreeSpaceEx(TEXT("c:\\"), &avail, &total, &free);

// GByte 로 표현을 하기 위한 부분.. MByte는 숫자가 너무커서... -_-;
m_total = (int)(total.QuadPart>>30);
m_free = (int)(free.QuadPart>>30);

// 간단하게 메시지 박스로 출력을 해서 확인한다.
wsprintf(buf, TEXT("실제용량 %d GByte, 남은용량 %d GByte"), m_total, m_free);
MessageBox(hWnd, buf, TEXT("test"), MB_OK);
참고로 MByte 단위로 하드디스크의 용량을 계산하고자 한다면 아래와 같이 수정을 해주면 된다.
m_total = (int)(total.QuadPart >> 20);
m_free = (int)(free.QuadPart >> 20);

2008. 9. 19. 11:14

윈도우를 투명하게!!!


프로그램을 하다보면 이런 저런 황당한 요구사항을 많이 겪게 된다. 가령 현재 실행되는 윈도우를 약간 투명하게 해서 그 프로그램 아래 있는 다른 것들을 볼 수 있도록 해달라는..

대충 알송의 데스크톱 가사보기와 같은 그런 걸 원하는 모양이다.

아.. 저런건 어찌 만들지...-_- 하면서 이리 저리 검색을 해본 결과.. 가능한 것이었고.. 간단한 테스트 프로그램을 통해 원하는 결과를 대충 얻어 포스팅 한다.

현재 사용하는 툴은 VS2005이고, Windows API로 작성이 되었다.

투명한 윈도우를 만들기 위해서는 SetLayeredWindowAttributes() 라는 함수를 사용해야 한다. 이녀석은 Layered Window 의 투명도 / 색상 등을 설정할 수 있는 함수이다.
BOOL SetLayeredWindowAttributes(  
    HWND hwnd,            - 투명하게 처리할 윈도우의 핸들
    COLORREF crKey,    - 대상 윈도우의 투명하게 처리할 색상(COLORREF)값
    BYTE bAlpha,           - 대상 윈도우의 투명도를 설정 ( 0 ~ 255)
    DWORD dwFlags       -  LWA_COLORKEY, LWA_ALPHA 등의 옵션
);

이 함수를 사용하기 위해서는 'Windows 2000 이상의 운영체제'여야 하고, 'Windows.h 헤더파일을 포함'하고 'User32.lib 라는 라이브러리를 사용'해야 한다. 뭐 요즘 사용하는 운영체제는 거의 XP 이상일 것이고, 윈도우즈 프로그램을 하면 기본적으로 Windows.h 와 User32.lib는 사용할 것이니.. 별로 신경을 안써도 될 듯하다.

추가로 신경을 써야 할 부분은 #include <windows.h> 위에 추가시켜 줘야 하는 부분이 있다는 것이다.

 #define WINVER 0x500  
 #define _WIN32_WINNT 0x500 
 #include <windows.h>

위와 같이 처리해주는 부분이 있어야 하는 이유는... 윈도우즈 프로그램에서는 윈도우즈 버전에 따라 사용 혹은 사용할 수 없는 함수들이 있다고 한다. Winodws 2000 이상에서만 사용되는 함수를 사용하기 위해서는 위와같이 처리해주어야 한다. 그렇지 않으면 에러가 발생할지도... ^^;

CreateWindowsEX()를 사용해 윈도우즈를 생성할 때 WS_EX_LAYERED라는 속성을 넣어준다.
아니면, 윈도우즈 생성시기가 아닌 나중에라도

SetWindowLong ( hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED );
를 쓰던지 해서 이녀석을 넣어줘야 정상적으로 투명 윈도우를 만들어낼 수 있다.

마지막으로 SetLayeredWindowAttributes() 함수를 사용한다. 이 함수의 네번 째 인자는 LWA_ALPHA를 사용하고, 세번째 인자의 값을 조절하면서 투명도를 조절하면 된다.

SetLayeredWindowAttributes(hDlg, 0, 100, LWA_ALPHA);
이렇게 처리를 해주면...
사용자 삽입 이미지

사용자 삽입 이미지
이렇게 변한다고... ㅋ


음.. 조금 신기해 주는데.. ㅋㅋ

2008. 9. 11. 15:20

Windows Power Scheme Management APIs



Windows system 에서 Power Scneme 을 관리하는 API들이다.

음.. 관리라...
일단 존재하지 않는 power scheme을 생성할 수 있을 것이고, 생성되어 있는 power shceme의 정보를 가져오거나 업데이트 할 수 있을 것이고.. 현재 사용되고 있는 power의 정보(데이터, GUID)등을 가져오고나 업데이트 할 수 있을것이고, 마지막으로 존재하는 맘에 들지 않는 power scheme을 제거할 수 있는 등..
뭐 그런것들이 있을것이다.
이런 일들을 하는 API들을 알아본다.


다음과 같은 APIs 를 이용하여 Power Scheme 을 관리할 수 있다.
GetActivePwrScheme() - 현재 사용중인(활성화 된) power scheme의 index를 가져온다.
GetCurrentPowerPolicies() - 현재 사용중인(활성화 된) power shceme의 setting 정보를 가져온다.
SetActivePwrScheme() - 현재 사용중인(활성화 된) power scheme의 setting을 바꾼다.
WritePwrScheme() - 새로운 power scheme 을 생성한다. 이녀석을 적용시키려면 반드시 SetActivePwrScheme()를 사용해야 한다.
DeletePwrScheme() - 존재하는 power scheme 중 원하는 녀석을 삭제한다.

추가로.. scheme을 업데이트 하는 녀석들은 다음과 같다.
WritePwrScheme(), WriteGlobalPwrPolicy(), WritePorcessorPwrScheme()
그리고 이를 적용시키기 위해서는 SetActivePwrScheme() 를 사용해줘야 한다.

용도에 맞게 골라서 사용을 자~알하면 된다.


2008. 9. 11. 10:48

Windows Power Management Structures


Windows system의 API가 제공하는 Power Management관련 structures(구조체)에 대해서 이야기 해보려 한다.

Windows system의 전력관리에 사용되는 구조체들은 다음과 같다.
ADMINISTRATOR_POWER_POLICY
BATTERY_INFORMATION
BATTERY_MANUFACTURE_DATE
BATTERY_QUERY_INFORMATION
BATTERY_REPORTING_SCALE
BATTERY_SET_INFORMATION
BATTERY_STATUS
BATTERY_WAIT_STATUS
DISPLAY_BRIGHTNESS
GLOBAL_MACHINE_POWER_POLICY
GLOBAL_POWER_POLICY
GLOBAL_USER_POWER_POLICY
MACHINE_POWER_POLICY
MACHINE_PROCESSOR_POWER_POLICY
POWER_ACTION_POLICY
POWER_POLICY
POWERBROADCAST_SETTING
PROCESSOR_POWER_INFORMATION
PROCESSOR_POWER_POLICY
PROCESSOR_POWER_POLICY_INFO
SYSTEM_BATTERY_STATE
SYSTEM_POWER_CAPABILITIES
SYSTEM_POWER_INFORMATION
SYSTEM_POWER_LEVEL
SYSTEM_POWER_POLICY
SYSTEM_POWER_STATUS
USER_POWER_POLICY

각각의 내용을 보면, 중복되는것도 있고 포함관계에 있는것도 있고.. 여튼 이리저리 복잡한 듯 하다.
일단 이녀석들의 내용을 알아야 원하는 데이터를 가져오거나 바꿀 수 있을 듯 한데.. -_-;;
귀찮다.. ㅋ

대충 계층도랄까? 포함관계에 있는 녀석들을 보니 이렇더군..
GLOBAL_POWER_POLICY
           - GLOBAL_MACHINE_POWER_POLICY
                      - SYSTEM_POWER_STATUS
           - GLOBAL_USER_POWER_POLICY
                      - POWER_ACTION_POLICY
                                 - POWER_ACTION

POWER_POLICY
           - USER_POWER_POLICY       
                      - POWER_ACTION_POLICY
                                 - POWER_ACTION
           - MACHINE_POWER_POLICY   
                      -  SYSTEM_POWER_STATUS

MACHINE_PROCESSOR_POWER_POLICY   
           -  PROCESSOR_POWER_POLICY   
                      -  PROCESSOR_POWER_POLICY_INFO

SYSTEM_POWER_POLICY   
           -  POWER_ACTION_POLICY
                      - POWER_ACTION
           - SYSTEM_POWER_STATUS
           - SYSTEM_POWER_LEVEL   
                      - POWER_ACTION_POLICY
                                 - POWER_ACTION
                       - SYSTEM_POWER_STATUS

SYSTEM_POWER_CAPABILITIES   
           - BATTERY_REPORTING_SCALE
           - SYSTEM_POWER_STATUS

ADMINISTRATOR_POWER_POLICY   
           - SYSTEM_POWER_STATUS

PROCESSOR_POWER_INFORMATION

POWERBROADCAST_SETTING

SYSTEM_POWER_INFORMATION

SYSTEM_BATTERY_STATE

BATTERY_INFORMATION

BATTERY_MANUFACTURE_DATE

BATTERY_QUERY_INFORMATION  

BATTERY_REPORTING_SCALE

BATTERY_SET_INFORMATION

BATTERY_STATUS

BATTERY_WAIT_STATUS

DISPLAY_BRIGHTNESS

해놓고 보니깐.. 이런 작업을 왜했나 싶은것이.. 필요 없는 짓을 한걸까? ㅋㅋ


2008. 9. 8. 13:55

VS2005 응용프로그램 에러.. "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다..."



프로그램을 짜다보면 희안한 그리고 황당한 일을 많이 겪는다.

'VS2005' 에서 간단한 테스트 프로그램을 작성하고 동작을 잘하는 것을 확인하고나서 다른 PC로 실행파일을 옮겨 실행을 시키니 다음과 같은 에러 메시지가 뜬다.
응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오.
사용자 삽입 이미지

같은 프로그램을 동일한 OS가 설치된 다른 기계에서 실행이 되지 않는 이런.. XX같은 일이... -_-;;
해결방안을 찾기 위해 구글이며 네이버며.. 여기 저기 뒤진 결과 일단은 해결을 했다.

가장 간단한 방법은 'vcredist_x86.exe'를 에러가 발생하는 PC에 설치를 해주면 된다.
VS2005가 설치된 PC에서 "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86"폴더를 확인하자.
vcredist_x86.exe 라는 파일을 발견할 수 있을 것이다. 이 녀석을 테스트 하려 하는 PC에 설치를 한 뒤 에러가 발생했던 테스트 프로그램을 실행시켜 보면 정상적으로 동작하는 것을 확인 할 수 있다.
혹시... visual studio가 설치 되지 않아 파일을 찾을 수 없는 사람이라면... 아래 파일을 받아서 사용하면 된다.

다른 방법으로는 mfc80.dll, msvcr80.dll 등을 실행파일과 같은 폴더에 복사한 뒤 프로그램을 실행하면 된다고들 하는데.. 본인의 경우에서는 그렇지 않았다. 대신 위에서 설명한 vcredist_x86.exe 를 설치한 뒤에 정상적으로 동작을 하였다.

이런 현상이 발생하는 이유는 다음과 같다.
Windows XP에서는 DLL Hell(새로운 프로그램을 설치할때 다른 프로그램이 사용하는 DLL을 덮어 쓰거나 혹은 버전의 불일치로 오는 문제로 기존의 프로그램들이 제대로 동작하지 않는 경우가 있다.)을 빠져나가려고 Side-by-Side Assembly라는 개념을 만들었다.
이건 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.

SideBySideAssembly 의 강력한 점은 응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.

이러한 새로운 방식으로 기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다.

문제 해결에 대한 페이지
http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary
http://www.codeproject.com/cpp/vcredists_x86.asp
http://cafe.naver.com/solidcode.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8


- 홍가일보 블로그에서 살짝 가져옴... ^^;

아.. 그런데.. 이런 응용프로그램을 만들어 배포할 경우에는 어쩌지? -_-;;


2008. 9. 6. 10:24

전원 상태를 알아오는 SYSTEM_POWER_STATUS struct



'SYSTEM_POWER_STATUS' 는 Windows System에서 전력관리에 사용되는 구조체이다.

현재 동작하는 Windows System의 전원상태에 대한 정보를 담고 있다고 보면 된다. 전원에 대한 상태라는 것은 현재 사용하고 있는 전원이 AC인지 아니면 배터리를 사용하고 있는지에 대한 정보, 또 배터리를 사용하고 있다면 남아있는 배터리의 양이라든지 life time이라든지에 대한 정보를 말한다.

이녀석에 대한 정보를 가져오기 위해서는 'GetSystemPowerStatus()'라는 함수를 사용하게 된다. GetSystemPowerStatus()함수의 인자로 SYSTEM_POWER_STATUS가 사용되고, 현재 전원에 대한 상태정보를 인자로 사용된 이 구제체로 복사를 해오는 것이다.

현재 전원에 대한 상태정보를 알기 위해서 이 구조체를 사용하기만 하면된다.
Syntax를 보면 다음과 같다.
typedef struct _SYSTEM_POWER_STATUS {
BYTE ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE Reserved1;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
ACLineStatus
: AC power의 상태를 말한다. (0 : Offline, 1 : Online, 255 : Unknown status)

BatteryFlag
: 배터리의 charge status를 나타낸다.
  1    : High-the battery capacity is at more than 66 %
  2    : Low—the battery capacity is at less than 33 %
  4    : Critical—the battery capacity is at less than 5 %
  8    : Charging
  128 : No system battery
  255 : Unknown status—unable to read the battery flag information

BatteryLifePercent
남아있는 배터리의 양을 %로 표현한다. 0 ~ 100 사이의 값으로 표현되고, 상태를 알 수 없으면 255.

Reserved1
Reserved. must be zero

BatteryLifeTime
The number of seconds of battery life remaining, or -1 if remaining seconds are unknown.

BatteryFullLifeTime
The number of seconds of battery life when at full charge, or -1 if full battery lifetime is unknown.

참고 : MSDN
2008. 9. 5. 16:10

Windows Power management API - PBT_APMPOWERSTATUSCHANGE Event


Windows System에서 전력관리(Power management)를 위해 사용되는 API들이 있다. 지금 보게 될 'PBT_APMPOWERSTATUSCHANGE '라는 녀석도 그에 속한다.

'PBT_APMPOWERSTATUSCHANGE'는 사용하는 기계의 전원상태(power status)의 변화가 생길때 Windows system에서 어플리케이션에 전달(broadcast)되는 event 이다.
예를들어 노트북에서 AC전원을 사용하다가 전원코드를 뽑아서 배터리의 전원을 사용한다던지, 아님 그 반대든지.. 뭐 그런경우 시스템에서는 현재 사용하는 기계의 전원상태의 변화가 생김을 인지하고 이 이벤트를 날려준다(broadcasting).

이 이벤트는 'WM_POWERBROADCAST'라는 메시지를 통해서 어플리케이션에 전달되고, 해당하는 이벤트는 메시지의 'wParam'을 통해 전달된다.


사용방법은.. 대충 이렇다.
음.. Windows API를 예로들어 설명한다.(다른건 할줄몰라서.. 이것도.. 잘은.. -_-)

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;

    switch (iMessage) {
        ...
        case WM_POWERBROADCAST:
            switch(wParam){
            case PBT_APMPOWERSTATUSCHANGE:
                MessageBox(hWnd, TEXT("test"), TEXT("test"), MB_OK);
                return 0;
            }
        return 0;
        ...
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


추가로 WM_POWERBROADCAST 메시지의 wParam은 다음과 같은 것들이 있다.

Event

Meaning

PBT_APMBATTERYLOW

Battery power is low

PBT_APMOEMEVENT

OEM-defined event occurred

PBT_APMPOWERSTATUSCHANGE

Power status has changed

PBT_APMQUERYSUSPEND

Request for permission to suspend

PBT_APMQUERYSUSPENDFAILED

Suspension request denied

PBT_APMRESUMEAUTOMATIC

Operation resuming automatically after event

PBT_APMRESUMECRITICAL

Operation resuming after critical suspension

PBT_APMRESUMESUSPEND

Operation resuming after suspension

PBT_APMSUSPEND

System is suspending operation


여기를 참고하면 될 듯 하다.
WM_POWERBROADCAST : http://msdn.microsoft.com/en-us/library/aa373247.aspx
PBT_APMPOWERSTATUSCHANGE : http://msdn.microsoft.com/en-us/library/aa372715(VS.85).aspx

2008. 8. 20. 10:52

GetCurrentDirectory()를 이용한 Windows에서 현재경로 받아오기..



Windows에서 현재 실행되는 프로그램의 현재 작업 디렉토리를 알아오기 위해 "GetCurrentDirectory()"를 사용한다.

첫번 째 인자로 경로를 표시할 문자열의 길이를 넣어주고, 두번 째 인자로 실제 받아온 경로를 보여준다.

간단히 예를 들면...
char Path[255];

GetCurrentDirectory(255, Path);
printf("Current Path is %s\n", Path);

이렇게 하면 콘솔창에서 현재 위의 프로그램의 경로를 확인할 수 있다.

MSDN을 검색하니 다음과 같이 되어있다.

GetCurrentDirectory Function

Retrieves the current directory for the current process.

Syntax

DWORD WINAPI GetCurrentDirectory(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);

Parameters

nBufferLength [in]

The length of the buffer for the current directory string, in TCHARs. The buffer length must include room for a terminating null character.

lpBuffer [out]

A pointer to the buffer that receives the current directory string. This null-terminated string specifies the absolute path to the current directory.

To determine the required buffer size, set this parameter to NULL and the nBufferLength parameter to 0.

Return Value

If the function succeeds, the return value specifies the number of characters that are written to the buffer, not including the terminating null character.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

If the buffer that is pointed to by lpBuffer is not large enough, the return value specifies the required size of the buffer, in characters, including the null-terminating character.

Remarks

Each process has a single current directory that consists of two parts:

  • A disk designator that is either a drive letter followed by a colon, or a server name followed by a share name (\\servername\sharename)
  • A directory on the disk designator

To set the current directory, use the SetCurrentDirectory function.

In certain rare cases, if the specified directory is on the current drive, the function might omit the drive letter and colon from the path. Therefore, the size that is returned by the function might be two characters less than the size of the specified string, not including the terminating null character. This behavior might occur in edge situations such as in a services application. If you need the drive letter, make a subsequent call to GetFullPathName to retrieve the drive letter.

Examples

For an example, see Changing the Current Directory.

Requirements

Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
Server Requires Windows Server 2008, Windows Server 2003, or Windows 2000 Server.
Header

Declared in WinBase.h; include Windows.h.

Library

Use Kernel32.lib.

DLL

Requires Kernel32.dll.

Unicode/ANSI

Implemented as GetCurrentDirectoryW (Unicode) and GetCurrentDirectoryA (ANSI).