먼저 시스템에 부착되어 있는 메인 메모리의 크기는 GlobalMemoryStatus라는
API를 이용하면 됩니다. 예제 코드는 다음과 같습니다.
//===========================================================
// lMemTotal : 실제 메모리의 전체 크기 (KB 단위)
// lAvailMemTotal : 사용 가능한 실제 메모리의 크기 (KB 단위)
// lVirtualTotal : 가상 메모리의 전체 크기 (KB 단위)
//===========================================================
void GetMemoryStatus(long *lMemTotal, long *lAvailMemTotal, long *lVirtualTotal)
{
double var;
MEMORYSTATUS memoryStatus;
memset (&memoryStatus, sizeof (MEMORYSTATUS), 0);
memoryStatus.dwLength = sizeof (MEMORYSTATUS);
GlobalMemoryStatus (&memoryStatus);
lMemTotal = memoryStatus.dwTotalPhys / 1024;
lAvailMemTotal = memoryStatus.dwAvailPhys / 1024;
lVirtualTotal = memoryStatus.dwTotalVirtual / 1024;
}
다음으로 CPU의 종류를 알아내는 코드는 다음과 같습니다.
//===============================================================
// GetProcessorInfo : 프로세서에 대한 정보를 읽어온다.
// lpCPUSpeed : CPU의 속도. 기록된 시스템에서만 읽어온다.
// lpProcessorType : 프로세서의 종류
// lpNumProcessors : 프로세서의 개수. NT의 경우에만 의미가 있다.
//===============================================================
void GetProcessorInfo(LPSTR lpCPUSpeed, LPSTR lpProcessorType, LPSTR lpNumProcessors)
{
SYSTEM_INFO sysInfo;
LONG result;
HKEY hKey;
DWORD data;
DWORD dataSize;
lpCPUSpeed[0] = 0;
// ---------------------------------------------
// 프로세서의 속도를 얻어낸다.
// ---------------------------------------------
result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,"HardwareDescriptionSystemCentralProcessor", 0, KEY_QUERY_VALUE, &hKey);
if (result == ERROR_SUCCESS)
{
result = ::RegQueryValueEx (hKey, "~MHz", NULL, NULL,(LPBYTE)&data, &dataSize);
wsprintf(lpCPUSpeed, "%d MHz", data);
}
RegCloseKey (hKey);
// ------------------------------------------
// 하드웨어 정보를 얻어낸다.
// ------------------------------------------
GetSystemInfo (&sysInfo);
// 프로세서 타입부터 검사한다.
if (sysInfo.dwProcessorType == PROCESSOR_INTEL_386)
strcpy(lpProcessorType, "Intel 386");
else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_486)
strcpy(lpProcessorType, "Intel 486");
else if (sysInfo.dwProcessorType == PROCESSOR_INTEL_PENTIUM)
{
if (sysInfo.wProcessorLevel == 6)
strcpy(lpProcessorType, "Intel Pentium (II/Pro)");
else strcpy(lpProcessorType, "Intel Pentium");
}else strcpy(lpProcessorType, "알 수 없는 시스템");
// 프로세서의 갯수를 검사한다.
wsprintf(lpNumProcessors, "%d", sysInfo.dwNumberOfProcessors);
}다음으로 현재 사용 중인 운영체제의 종류를 알아내는 코드는 다음과 같습니다.
//===============================================================
// GetOSVersion : OS의 버전을 얻어온다.
// --------------------------------------------------------------
// lpstInfo
// lpstBuildNumber
// lpstServicePack
//===============================================================
void GetOSVersion (LPSTR lpstInfo, LPSTR lpstBuildNumber, LPSTR lpstServicePack)
{
int stat = 0;
TCHAR data [64];
DWORD dataSize;
DWORD win95Info;
OSVERSIONINFO versionInfo;
HKEY hKey;
LONG result;
lpstServicePack[0] = 0;
versionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
// 버전 정보를 얻어낸다.
if (!::GetVersionEx (&versionInfo))
{
strcpy(lpstInfo, "운영체제 정보를 얻을 수 없습니다.");
return;
}
// NT이면 서버인지 웍스테이션인지 검사한다. 이는 레지스트리를 보고 검사한다.
if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
strcpy(lpstInfo, "Windows NT");
dataSize = sizeof (data);
result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,"SystemCurrentControlSetControlProductOptions", 0, KEY_QUERY_VALUE, &hKey);
if (result != ERROR_SUCCESS)
return;
result = ::RegQueryValueEx (hKey, "ProductType", NULL, NULL, (LPBYTE) data, &dataSize);
RegCloseKey (hKey);
if (result != ERROR_SUCCESS)
return;
if (lstrcmpi (data, "WinNT") == 0)
strcpy(lpstInfo, "Windows NT Workstation");
else if (lstrcmpi (data, "ServerNT") == 0)
strcpy(lpstInfo, "Windows NT Server");
else strcpy(lpstInfo, "Windows NT Server - Domain Controller");
// NT 버전을 알아낸다.
if (versionInfo.dwMajorVersion == 3 || versionInfo.dwMinorVersion == 51)
strcat(lpstInfo, " 3.51");
else if (versionInfo.dwMajorVersion == 5)
// 윈도우 2000의 경우
strcat(lpstInfo, " 5.0");
else strcat(lpstInfo, " 4.0");
// Build 번호를 알아낸다.
wsprintf(lpstBuildNumber, "%d", versionInfo.dwBuildNumber);
}
else if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
strcpy(lpstInfo, "Windows 95");
if ((versionInfo.dwMajorVersion > 4) || ((versionInfo.dwMajorVersion == 4)&& (versionInfo.dwMinorVersion > 0)))
{
strcpy(lpstInfo, "Windows 98");
}
// 윈도우 95는 Build 번호가 하위 워드에 들어간다.
win95Info = (DWORD)(LOBYTE(LOWORD(versionInfo.dwBuildNumber)));
wsprintf(lpstBuildNumber, "%d", win95Info);
}
else wsprintf(lpstInfo, "Windows 3.1");
// 서비스 팩 정보를 얻어낸다.
strcpy(lpstServicePack, versionInfo.szCSDVersion);
}
댓글 없음:
댓글 쓰기