API

시스템 정보 알아내기....네이버 지식인 참조

디버그정 2009. 10. 4. 00:02

api완전정복책도보고 지식인 고수님들 도움도얻어서 만들고있는 간단한 systeminformation알아오는 소스가있는데요 수많은 api를 찾아보다가  아래의 2개 api를 찾았는데요 아래의 msdn도 보고그랬는데도 실제로 활용이

어렵습니다. 지식인 고수님들께서 도와주세요ㅠㅠ

http://msdn2.microsoft.com/en-us/library/ms724833.aspx

http://msdn2.microsoft.com/en-us/library/ms724429.aspx


OSVERSIONINFOEX : OS버전 가져오기
hostent 구조체 : IP정보를 가져오기







#include <windows.h>


// 윈도우 프로시저(각종 메시지 처리)

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,

                                           WPARAM wParam, LPARAM lParam);

HINSTANCE g_hInst;

LPCTSTR lpszClass = TEXT("System Information");

void GetMemoryStatus(long *lMemTotal, long *lAvailMemTotal, long *lVirtualTotal);

void GetProcessorInfo(LPSTR lpCPUSpeed, LPSTR lpProcessorType,

                                 LPSTR lpNumProcessors);


enum INFO {MEMORY, PROCESSOR};  // 열거형 타입 선언



// 메인함수(콘솔의 main에 해당)

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

                                 LPSTR lpCmdLine, int nCmdShow)
{
 MSG Msg;
 HWND hWnd;
 WNDCLASS WndClass;
 
 g_hInst = hInstance;

 WndClass.cbClsExtra = 0;
 WndClass.cbWndExtra = 0;
 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 WndClass.hInstance = hInstance;
 WndClass.lpfnWndProc = WndProc;
 WndClass.lpszClassName = lpszClass;
 WndClass.lpszMenuName = NULL;
 WndClass.style = CS_HREDRAW | CS_VREDRAW;

 RegisterClass(&WndClass);

 hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);
 

 ShowWindow(hWnd, nCmdShow);


 while (GetMessage(&Msg, NULL, 0, 0))
 {
  TranslateMessage(&Msg);
  DispatchMessage(&Msg);
 }
 return (int)Msg.wParam;
}


void GetMemoryStatus(long *lMemTotal, long *lAvailMemTotal, long *lVirtualTotal)
{
 MEMORYSTATUS memoryStatus;


 memset(&memoryStatus, 0, sizeof(MEMORYSTATUS));

 memoryStatus.dwLength = sizeof(memoryStatus);

 GlobalMemoryStatus(&memoryStatus);


 // 기본 단위는 바이트
 // 아래는 KB 단위로 환산...
 
 *lMemTotal = memoryStatus.dwTotalPhys / 1024;

 *lAvailMemTotal = memoryStatus.dwAvailPhys / 1024;

 *lVirtualTotal = memoryStatus.dwTotalVirtual / 1024;
}


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, "Hardware\\Description\\System\\CentralProcessor\\0", 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);
}


// 윈도우 프로시저 함수(각종 메시지 처리)

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,

                                           WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 HWND hButton1;
 HWND hButton2;
 long lMemTotal = 0;
 long lAvailMemTotal = 0;
 long lVirtualTotal = 0;
 static TCHAR CPUSpeed[100];
 static TCHAR ProcessorType[100];
 static TCHAR NumProcessors[100];

 static TCHAR MemoryInfo[200];
 static TCHAR ProcessorInfo[250];
 static INFO InfoType = MEMORY;


 switch (iMessage)
 {
 case WM_CREATE :
  hButton1 = CreateWindow(TEXT("button"), TEXT("Memory Info"),

                  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   10, 10, 100, 30, hWnd, (HMENU)100, g_hInst, NULL);


  hButton2 = CreateWindow(TEXT("button"), TEXT("Processor Info"),

                  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   10, 50, 100, 30, hWnd, (HMENU)101, g_hInst, NULL);
  return 0;
 
 case WM_COMMAND :
  switch (LOWORD(wParam))  // 컨트롤의 ID처리
  {
  case 100 :
   GetMemoryStatus(&lMemTotal, &lAvailMemTotal, &lVirtualTotal);

   wsprintf(MemoryInfo, "전체 실제 메모리: %d, 사용가능 실제 메모리: %d,전체 가상 메모리: %d", lMemTotal, lAvailMemTotal, lVirtualTotal);

    
   InfoType = MEMORY;
   break;


  case 101 :
   GetProcessorInfo(CPUSpeed, ProcessorType, NumProcessors);
   wsprintf(ProcessorInfo, "프로세서 속도: %s, 타입: %s, 갯수: %s", CPUSpeed,
    ProcessorType, NumProcessors);  
   InfoType = PROCESSOR;
   break;
  } 
  InvalidateRect(hWnd, NULL, TRUE);
  return 0;


 case WM_PAINT :
  hdc = BeginPaint(hWnd, &ps);
  switch (InfoType)
  {
  case MEMORY :
   TextOut(hdc, 100, 250, MemoryInfo, lstrlen(MemoryInfo));
   break;
  case PROCESSOR :
   TextOut(hdc, 100, 250, ProcessorInfo, lstrlen(ProcessorInfo));
  }
  EndPaint(hWnd, &ps);
  return 0;


 case WM_DESTROY : 
  PostQuitMessage(0);
  return 0;
 }
 
 return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}