[WinAPI] [C++] 3 - 取得電腦名稱、磁碟型態、容量資訊

此練習主要是取得系統資訊(電腦名稱、磁碟容量、磁碟類型等等)
用到的API有以下:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85).aspx
BOOL WINAPI GetComputerName(
  _Out_    LPTSTR lpBuffer,
  _Inout_  LPDWORD lpnSize
);
傳入要寫入電腦名稱的bufferbuffer尺寸後,就可取得電腦名稱了。若輸入的buffer尺寸(lpnSize)太小,會導致無法取得電腦名稱。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx 
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742(v=vs.85).aspx
BOOL WINAPI GetDiskFreeSpaceEx(  _In_opt_   LPCTSTR lpDirectoryName,  _Out_opt_  PULARGE_INTEGER lpFreeBytesAvailable,  _Out_opt_  PULARGE_INTEGER lpTotalNumberOfBytes,  _Out_opt_  PULARGE_INTEGER lpTotalNumberOfFreeBytes);
輸入磁碟機路徑(若路徑為NULL,會查找當前磁碟機的根目錄),此函式會回傳指定的磁碟機的總容量、空閒的空間容量等…(單位:位元組Byte)

由於輸出的型別是ULARGE_INTEGER所以有些而不同。
typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  };
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
此型別可讓使用者在x32作業系統上也可來利用64位元的整數。若系統是x64系統,可直接使用QuadPart;反之可使用HighPart搭配LowPart來取得64位元的整數資訊。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx
UINT WINAPI GetDriveType(
  _In_opt_  LPCTSTR lpRootPathName
);
輸入磁碟機路徑(若路徑為NULL,會查找當前磁碟機的根目錄),會回傳磁碟機的型態。(詳細說明可看底下程式)

  
#include "stdafx.h"
#include <windows.h> 
#include <math.h>   //加入函式標頭(pow)
int _tmain(int argc, _TCHAR* argv[])
{
  //有定義_UNICODE時,TCHAR代表wchar_t;否則,TCHAR代表char
  //底下函式,也會依照是否定義_UNICODE,看使用WA結尾的函式
  TCHAR  computerNameBuffer[MAX_COMPUTERNAME_LENGTH+1]={0}; 
  DWORD  bufferLength=MAX_COMPUTERNAME_LENGTH+1;

  //取得當前電腦名稱,名稱字串長度
  GetComputerName(computerNameBuffer, &bufferLength);
 
  ULARGE_INTEGER FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes;
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx
  //取得磁碟空間資訊(位元組),匯出的型別是ULARGE_INTEGER
  //ULARGE_INTEGER是為了讓使用者在位元系統中也可使用位元所開發出來的。
  //High Part/ Low Part分別代表前位元跟後位元。
  //Quad Part則可用於本來就是位元的系統上
  GetDiskFreeSpaceEx(NULL, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);

  //利用Quad Part來計算
  //計算出GB
  TotalNumberOfFreeBytes.QuadPart/pow(1024.0, 3); 
  //計算出KB
  TotalNumberOfFreeBytes.QuadPart/pow(1024.0, 2); 
  //計算出MB
  TotalNumberOfFreeBytes.QuadPart/(1024);

  //利用High/Low Part來計算
  //HighPart向左偏移位元,加上LowPart即等於QuadPart的值(若本機電腦為x64)
  //計算出GB
  (TotalNumberOfBytes.HighPart*(pow(2.0, 32)) + TotalNumberOfBytes.LowPart)/pow(1024.0, 3);
  //計算出KB
  (TotalNumberOfBytes.HighPart*(pow(2.0, 32)) + TotalNumberOfBytes.LowPart)/pow(1024.0, 2);
  //計算出MB
  (TotalNumberOfBytes.HighPart*(pow(2.0, 32)) + TotalNumberOfBytes.LowPart)/(1024); 

  UINT uType = ::GetDriveType(_T("Q:\\"));
  switch(uType)
  {
  case DRIVE_NO_ROOT_DIR:  //1
     //此磁碟機是無效的
     break;
  case DRIVE_REMOVABLE: //2
     //此磁碟是可卸除式的磁碟
     break;
  case DRIVE_FIXED:   //3
     //此磁碟是固定磁碟,一般為硬碟
     break;
  case DRIVE_REMOTE:    //4
     //此磁碟是遠端的網路磁碟
     break;
  case DRIVE_CDROM:   //5
     //此磁碟是光碟機
     break;
  case DRIVE_RAMDISK:   //6
     //此磁碟是RAMDISK,記憶體當作磁碟使用
     break;
  case DRIVE_UNKNOWN:   //0
  default:
     break;
  }

  return 0; //跳出

}

參考資料:MSDN / Win 32 API(下) 視窗介面實務完全掌握

這個網誌中的熱門文章

[Tips] 設定桌面文字顏色

登入失敗: 使用者帳戶限制。可能原因為不允許空的密碼,登入時數限制,或強制的原則限制

[Win7] 電腦管理-損毀傾印