[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
);
傳入要寫入電腦名稱的buffer、buffer尺寸後,就可取得電腦名稱了。若輸入的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,看使用W或A結尾的函式
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(下) 視窗介面實務完全掌握