반응형
윈도우즈 버전이 필요한 경우가 생긴다.
설치를 할때나, 드라이버와의 호환성을 위해서 필요하다.
그것을 가져오는 루틴이다.
설치를 할때나, 드라이버와의 호환성을 위해서 필요하다.
그것을 가져오는 루틴이다.
- CString CPCInfoDlg::GetWindowsVersion()
- {
- CString strResult;
- unsigned int uVer = 0;
- int nVer = 0;
- uVer = WINVER;
- switch ( uVer )
- {
- case 0x0600 /*Windows LongHorn*/:
- return "Windows Long Horn(Vista)";
- case 0x0502 /*Windows Server 2003*/:
- return "Windows Server 2003";
- case 0x0501 /*Windows XP*/:
- nVer = GetServicePackVer();
- strResult.Format("Windows XP Service Pack %d", nVer );
- return strResult;
- case 0x0500 /*Windows 2000*/:
- return "Windows 2000";
- case 0x0410 /*Windows 98*/:
- return "Windows 98";
- case 0x0400 /*Windows 95*/:
- return "Windows 95";
- default:
- return "Unknown Windows Version";
- }
- }
- #define SERVICEPACKVER "System\\CurrentControlSet\\Control\\Windows"
- #define SERVICEPACKVALUE "CSDVersion"
- INT CPCInfoDlg::GetServicePackVer()
- {
- INT nResult = 0;
- HKEY hKey;
- TCHAR szValueName[255] = {0, };
- BYTE szValue[16300] = {0, };
- DWORD dwValueNameSize = 0;
- DWORD dwValueSize = 0;
- DWORD dwIndex = 0;
- BOOL bCheck = FALSE;
- BOOL bFlag = TRUE;
- if( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, SERVICEPACKVER, &hKey ) )
- {
- //Display ValueName 존재 여부 파악
- while( ERROR_NO_MORE_ITEMS != bCheck )
- {
- dwValueNameSize = sizeof( szValueName );
- dwValueSize = sizeof( szValue );
- bCheck = RegEnumValue( hKey, //서브키 핸들
- dwIndex, //인덱스
- szValueName, //값의 이름
- &dwValueNameSize, //값의 버퍼 길이
- NULL, //예약
- NULL, //데이터 타입
- szValue, //값
- &dwValueSize //값의 길이
- );
- if( ERROR_SUCCESS == bCheck && 0 == strcmp( szValueName, SERVICEPACKVALUE ) )
- {
- nResult = (int)szValue[1];
- }
- dwIndex++;
- }//end while( ERROR_NO_MORE_ITEMS != bReturn )
- }//if( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, KEY_HIDE_DRIVE, &hKey ) )
- return nResult;
- }
CString CPCInfoDlg::GetWindowsVersion() { CString strResult; unsigned int uVer = 0; int nVer = 0; uVer = WINVER; switch ( uVer ) { case 0x0600 /*Windows LongHorn*/: return "Windows Long Horn(Vista)"; case 0x0502 /*Windows Server 2003*/: return "Windows Server 2003"; case 0x0501 /*Windows XP*/: nVer = GetServicePackVer(); strResult.Format("Windows XP Service Pack %d", nVer ); return strResult; case 0x0500 /*Windows 2000*/: return "Windows 2000"; case 0x0410 /*Windows 98*/: return "Windows 98"; case 0x0400 /*Windows 95*/: return "Windows 95"; default: return "Unknown Windows Version"; } } #define SERVICEPACKVER "System\\CurrentControlSet\\Control\\Windows" #define SERVICEPACKVALUE "CSDVersion" INT CPCInfoDlg::GetServicePackVer() { INT nResult = 0; HKEY hKey; TCHAR szValueName[255] = {0, }; BYTE szValue[16300] = {0, }; DWORD dwValueNameSize = 0; DWORD dwValueSize = 0; DWORD dwIndex = 0; BOOL bCheck = FALSE; BOOL bFlag = TRUE; if( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, SERVICEPACKVER, &hKey ) ) { //Display ValueName 존재 여부 파악 while( ERROR_NO_MORE_ITEMS != bCheck ) { dwValueNameSize = sizeof( szValueName ); dwValueSize = sizeof( szValue ); bCheck = RegEnumValue( hKey, //서브키 핸들 dwIndex, //인덱스 szValueName, //값의 이름 &dwValueNameSize, //값의 버퍼 길이 NULL, //예약 NULL, //데이터 타입 szValue, //값 &dwValueSize //값의 길이 ); if( ERROR_SUCCESS == bCheck && 0 == strcmp( szValueName, SERVICEPACKVALUE ) ) { nResult = (int)szValue[1]; } dwIndex++; }//end while( ERROR_NO_MORE_ITEMS != bReturn ) }//if( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, KEY_HIDE_DRIVE, &hKey ) ) return nResult; }
이렇게 하면 윈도우즈의 버전을 가져올 수 있고,
원하는 버전의 서비스팩 값을 알아올 수 있다.
참고로 Explorer의 버전의 값들이다. _WIN32_IE의 값으로 확인할 수 있다.
IE 7.0 0x0700
IE 6.0 SP2 0x0603
IE 6.0 SP1 0x0601
IE 6.0
0x0600
IE 5.5 0x0550
IE 5.01 0x0501
IE 5.0 5.0a 5.0b 0x0500
IE 4.01 0x0401
IE 4.0 0x0400
IE 3.0 3.01 3.02 0x0300
반응형
'C & C++ > C & C++' 카테고리의 다른 글
[Tip] 중복없는 난수 발생 (0) | 2011.04.04 |
---|---|
[Tip] 한영 전환 함수 (0) | 2011.04.04 |
CString BYTE, WORD, DWORD (0) | 2011.03.31 |
[Tip] 모니터 해상도 구하기 (0) | 2011.03.31 |
[Tip] Sleep() 함수 대신 프로그램 딜레이 시키기 (0) | 2011.03.31 |
댓글