MSDN 에서 보면 GetVersionEx() 함수를 이용하여, 윈도우의 각종 버전 및 플래폼
그리고, 서비스팩 정보를 이용할 수 있는 샘플 자료가 있습니다.
위 자료를 좀 개선해서, Windows 2008 Servers 및 Windows Vista 에서도 정상적으로 동작하는
모델을 만들어 봤습니다. 클래스의 이름은 CWindowsVersion 입니다.
또한, 기존에 32 비트시스템에서 제작되어진 어플리케이션이 64 비트 윈도우에서 구동될 때
호환모드로 구동하게 되는데, 별다른 문제는 없지만 레지스트리를 액세스할 때 다음과 같은
문제가 발생합니다.
32비트 호환모드로 구동되는 프로그램은 HKEY_LOCAL_MACHINE\SOFTWARE 경로를
직접 액세스 할 수 없습니다.
64비트 전용으로 생성된 소프트웨어는 문제가 없지만 32비트로 만들어져 호환모드로 동작할 경우는 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node 아래처럼 32비트 응용프로그램을 위한
전용 경로를 사용해야합니다.
이것을 일일이 하나씩 변경하기 힘들어서, 64비트 운영체제에서 테스트해야하는 프로그램중에
32트로 만들어져 있고, 위의 경로및 그 경로의 하위를 액세스하는 경우 자동으로 경로를 변경해주어
동작하는데 문제가 없도록 API를 만들어 봤습니다.
소스는 Visual C++ 6.0, SP6, Enterprize Edition, 영문버전에서 작성되었으며
테스트는 Windows XP 32/64, Windows Server 2003 32/64, Windows Vista 32/64, Windows Server 2008 64
에서 테스트를 마쳤습니다.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 작성 : 2008-09-11 CROWBACK
// 수정 : 2008-09-17 CROWBACK
// 기존에 클래스 형태에서 WOW 라는 네임스페이스로 감싼 API 형태로 변경함.
// 특별히 멤버를 가진것도 아닌데, 객체를 선언하고 사용하는 불편을 제거하기 위함.
//
// 32비트로 컴파일된 실행파일이 64비트 시스템의 HKEY_LOCAL_MACHINE 의 SOFTWARE
// 영역 액세스의 접근이 차단되는 것을 하위 Wow6432Node로 자동 매칭 시킨다.
// 이러한 작업을 위한 Win32 API를 래핑한 함수들.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define MAX_REGVALUE 8196
typedef struct
{
_bstr_t name;
BYTE* data;
DWORD length;
DWORD type;
} TEnumValue;
//////////////////////////////////////////////////////////////////////////////
// 아래 항목들은 Win32 API 양식을 그대로 따른다. 기존 API들과 문법상 차이를 두지
// 않음으로써, 기존 소스 포팅에 도움이 되도록 한다.
LONG RegOpenKey(__in HKEY hKey, __in_opt LPCSTR lpSubKey, __out PHKEY phkResult);
LONG RegOpenKeyEx(__in HKEY hKey, __in LPCTSTR lpSubKey, DWORD ulOptions, __in REGSAM samDesired, __out PHKEY phkResult);
LONG RegCloseKey(__in HKEY hKey);
//////////////////////////////////////////////////////////////////////////////
// 아래 항목들은 작업의 편의를 위해서 새로 추가한 항목들이다.
// 각각의 기능은 별도로 석으로 설명한다.
// 열기에 실패하면 키를 강제로 생성한다. 그래로 실패하면 에러리턴.
LONG RegOpenKeyForce(__in HKEY hKey, __in_opt LPCSTR lpSubKey, __out PHKEY phkResult);
// 서브 아이템 여부와 상관없이, 키 전체를 강제로 삭제함.
LONG RegDeleteKeyForce(__in HKEY hKey, __in LPCTSTR lpSubKey);
// 서브 아이템 여부와 상관없이, 키 이름만 남기고 안에꺼를 몽땅 지움. (서브키 및 밸류 모두..)
LONG RegDeleteKeyEmpty(__in HKEY hKey, __in LPCTSTR lpSubKey);
// 특정 레지 경로를 지정한 후, 값을 직접 지정할 수 있다.
LONG RegSetValueDirect(__in HKEY hKey, __in LPCTSTR lpSubKey, __in LPCTSTR lpValueName, __in DWORD dwType, __in const BYTE* lpData, __in DWORD cbData);
// 특정 레지 경로의 값들을 vector에 한꺼번에 몽땅 읽어와 목록을 작성한다.
LONG RegEnumValueList(__in HKEY hKey, __in LPCTSTR lpSubKey, std::vector<TEnumValue>& array);
// RegEnumValueList 함수와 매칭되는 것으로, 읽어온 것들은 내부적으로 메모리를 할당하므로
// 모두 사용한 후에는 아래 함수를 이용하여 해제하여준다.
VOID RegEnumValueClear(std::vector<TEnumValue>& array);
// 특정 레지 경로의 하위 키 값들을 vector 에 한꺼번에 읽어와 목록을 작성한다.
LONG RegEnumKeyList(__in HKEY hKey, __in LPCTSTR lpSubKey, std::vector<_bstr_t>& array);
// 지정된 키를 다른 곳으로 복사한다. (하위 키 및 모든 값 포함..)
LONG RegCopyKey(HKEY hkeySrc, LPCTSTR szSrcSubKey, HKEY hkeyDest);
// 지정된 키를 다른 곳으로 이동한다. (하위 키 및 모든 값 포함..)
LONG RegMoveKey(HKEY hkeySrc, LPCTSTR szSrcSubKey, HKEY hkeyDest);
// 지정된 키의 이름을 변경한다.
LONG RegRenameKey(HKEY hkeySrc, const char* szSrcSUB, HKEY hkeyDest, const char* szDstSUB);
// 지정된 키 값을 reg 파일로 익스포트 시킨다.
BOOL RegExport(LPCTSTR szSrcKey, LPCTSTR szFilePath);
};