如何取得實體硬碟對應的磁碟代號 |
尚未結案
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
參考到此篇文章~
http://delphi.ktop.com.tw/topic.php?topic_id=38394
從登錄檔獲取磁碟機資訊[HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]~
不過只能對應到隨身碟或光碟~
如果遇到硬碟或外接式USB硬碟就不適用了~ 參考至此~也不是完全沒辦法~
http://www.goodells.net/multiboot/partsigs.htm
只要能取得實體硬碟的 DiskID 就能拿來跟前四個位元組比較~ 而如何取得 DiskID 就是我想問的問題~
最好能使用 DeviceIoControl 取得,如此一來才能對應到一些資訊~
或者是還有其他對應的方法? ps.WMI可以用,不過掃 Win32_LogicalDiskToPartition 軟碟機會很吵(這是問題的根源)~
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
procedure TDiskInfoForm.GetSpecifyDiskInfor(DriverName: String); var dwSectPerClust, dwBytePerClust, dwFreeClust, dwClust: DWORD; begin if GetDiskFreeSpace(PChar(DriverName), dwSectPerClust, dwBytePerClust, dwFreeClust, dwClust) then begin Gauge1.MaxValue:= dwClust; Gauge1.Progress:= dwClust - dwFreeClust; end else Gauge1.Progress:= 0; Label12.Caption:=InttoStr(dwClust * dwSectPerClust * dwBytePerClust div 1024) 'KB'; Label14.Caption:=InttoStr(dwFreeClust * dwSectPerClust * dwBytePerClust div 1024) 'KB'; end; procedure TDiskInfoForm.GetFullDriveInfor(DriverName: String); var nDriveType: Integer; lpVolName: array [0..200] of Char; lpFSNameBuff: array [0..50] of Char; dwVolSer, lpMaxComLen, lpFSFlags: DWORD; begin nDriveType:= GetDriveType(PChar(DriverName)); Case nDriveTYpe of 0: Label3.Caption:= '不知道'; 1: Label3.Caption:= '路徑未知'; DRIVE_REMOVABLE: Label3.Caption:= '軟碟機'; DRIVE_FIXED: Label3.Caption:= '硬碟機'; DRIVE_REMOTE: Label3.Caption:= '網路磁碟機'; DRIVE_CDROM: Label3.Caption:= '光碟機'; DRIVE_RAMDISK: Label3.Caption:= '虛擬磁碟機'; else Label3.Caption:= '不知道'; end; if GetVolumeInformationA(PChar(DriverName), lpVolName, 200, @dwVolSer, lpMaxComLen, lpFSFlags, lpFSNameBuff, 50) then begin if dwVolSer = 0 then Label5.Caption:= '' else Label5.Caption:= InttoHex(dwVolSer,8); Label7.Caption:= lpVolName; Label9.Caption:= lpFSNameBuff; end else begin Label5.Caption:= ''; Label7.Caption:= 'no Volume Available'; Label9.Caption:= 'no Disk' end; GetSpecifyDiskInfor(DriverName); end; procedure TDiskInfoForm.FormCreate(Sender: TObject); var lp: array[0..100] of Char; i: Integer; begin GetLogicalDriveStrings(100, lp); i:= 0; while (True) do begin if lp[i] = #0 then Break; ComboBox1.Items.Add(UpperCase(lp i)); i:= i 4; end; ComboBox1.Text:= 'C:\'; GetFullDriveInfor(ComboBox1.Text); end; procedure TDiskInfoForm.ComboBox1Change(Sender: TObject); begin GetFullDriveInfor(ComboBox1.Text); end; procedure TDiskInfoForm.Timer1Timer(Sender: TObject); begin if (ComboBox1.Text <> 'A:\') or (ComboBox1.Text <> 'B:\') then GetSpecifyDiskInfor(ComboBox1.Text); end; procedure TDiskInfoForm.Button1Click(Sender: TObject); begin close; end; end.自然就是寫程式最好的方式, 分享比獲得更快樂--Juneo 發表人 - juneo 於 2005/02/25 17:36:30 |
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
cashyy
高階會員 發表:117 回覆:322 積分:212 註冊:2004-04-30 發送簡訊給我 |
GetVolumeInformation為取得所有硬碟名稱、序號及格式
看看是不是你要的!
void __fastcall TForm1::Button1Click(TObject *Sender) { //清除ListBox1所有文字 ListBox1->Clear(); //取得現在運行的邏輯磁碟 DWORD Drives = ::GetLogicalDrives(); for(int x = 0; x < 32; x) if(Drives & (1 << x)) { String fs; String Drive = AnsiString(char('A' x)) ":\\"; DWORD sn, fsf; char Volume[80], snb[80], fsfb[80]; //取得指定磁碟序號&格式 if(::GetVolumeInformation(Drive.c_str(), Volume, sizeof(Volume), &sn, 0, &fsf, fsfb, sizeof(fsfb))) { sprintf(snb, "%X", sn); Drive = " " AnsiString(Volume) ", 磁碟序號:" String(snb) ", 磁碟格式:" String(fsfb); } //將結果顯示在ListBox1上 ListBox1->Items->Add(Drive); } } //--------------------------------------------------------------------------- |
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
引言:登錄檔中的一樣~不曉得這資訊該怎麼用那個{xxx...}如一樣的代表是同一顆的hdd下分割的 邏輯磁區 如C: D: 所以光前4瑪只能判斷 是否同一顆 請問一下你使用 MOUNTVOL 是否都是正確的 我可以這樣說 登錄檔中的資料會殘留 所以光讀reg那機碼 是會誤判的 1 參考Windows DDK的sample 2 WDM Driver 3 SMBus ACPI 要不透過 OS 系統資料就得靠 SMBus 這類玩意 基本上 SMBus 沒啥人開放windows的資料可查Linux上就有 查看一下此bcb老版主的資料 應該是有意外收獲 不過那個只for xp 2k不行有bug http://delphi.ktop.com.tw/pop_profile.asp?mode=display&id=2079 基本上 我已說 另類想法 所以幫不上了 哈哈 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62793 |
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
ura
一般會員 發表:2 回覆:9 積分:2 註冊:2002-08-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |