請問如何取得已插入USB裝置的磁碟代號? |
缺席
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
請問如何取得已插入USB裝置的磁碟代號?
這篇的程式執行後雖然可以偵測出USB裝置的插拔 但是無法偵測出已經插入的 [所有][發表] 偵測USB儲存裝置的插拔和磁碟代號(含SourceCode) http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=91493 下面這篇研究中.. 請問如何用 Registry 取得 USB 隨身碟的磁碟代號? http://delphi.ktop.com.tw/board.php?cid=30&fid=73&tid=92400 還有其他方法嗎?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! 編輯記錄
pcboy 重新編輯於 2008-03-12 16:39:22, 註解 無‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
研究了點心得
[code cpp] procedure TForm1.Button3Click(Sender: TObject); var r: LongWord; Drives: array[0..128] of char; pDrive: pchar; i: Integer; DriverName: String; nDriveType: Integer; lpVolName: array [0..200] of Char; lpFSNameBuff: array [0..50] of Char; dwVolSer, lpMaxComLen, lpFSFlags: DWORD; begin Memo1.Lines.Clear; r := GetLogicalDriveStrings(sizeof(Drives), Drives); if r = 0 then exit; if r > sizeof(Drives) then raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY)); pDrive := Drives; // Point to the first drive for i:=0 to (r div 4)-1 do begin case GetDriveType(pDrive) of 0 : Memo1.Lines.Add(pDrive ' : The drive type cannot be determined.'); 1 : Memo1.Lines.Add(pDrive ' : The root directory does not exist.'); DRIVE_REMOVABLE : Memo1.Lines.Add(pDrive ' : DRIVE_REMOVABLE'); DRIVE_FIXED : Memo1.Lines.Add(pDrive ' : DRIVE_FIXED'); DRIVE_REMOTE : Memo1.Lines.Add(pDrive ' : DRIVE_REMOTE'); DRIVE_CDROM : Memo1.Lines.Add(pDrive ' : DRIVE_CDROM'); DRIVE_RAMDISK : Memo1.Lines.Add(pDrive ' : DRIVE_RAMDISK'); else Memo1.Lines.Add(pDrive ' : UNKNOWN'); end; DriverName := pDrive; if GetVolumeInformationA(PChar(DriverName), lpVolName, 200, @dwVolSer, lpMaxComLen, lpFSFlags, lpFSNameBuff, 50) then begin if dwVolSer = 0 then Memo1.Lines.Add('Volume Serial Number : 0') else Memo1.Lines.Add('Volume Serial Number : ' InttoHex(dwVolSer,8)); Memo1.Lines.Add('Volume Name : ' lpVolName); Memo1.Lines.Add('FileSystem Name Buffer : ' lpFSNameBuff); end else begin Memo1.Lines.Add('Volume Serial Number : N/A'); Memo1.Lines.Add('Volume Name : no Volume Available'); Memo1.Lines.Add('FileSystem Name Buffer : No Disk') end; // GetSpecifyDiskInfor(DriverName); Memo1.Lines.Add(''); inc(pDrive, 4); // Point to the next drive end; end; [/code] 問題來了 A:\ : DRIVE_REMOVABLE C:\ : DRIVE_FIXED D:\ : DRIVE_FIXED E:\ : DRIVE_FIXED F:\ : DRIVE_CDROM G:\ : DRIVE_CDROM 這台是 酒精 模擬的光碟 I:\ : DRIVE_REMOVABLE J:\ : DRIVE_REMOVABLE K:\ : DRIVE_FIXED L:\ : DRIVE_REMOVABLE A 是軟碟 I, J, K 其實是 數位相簿(外接 USB HD), 店家用 Partition Magic 做出 120 GB FAT32 (K碟), I, J其實是完全沒有內容的 L 是 USB 隨身碟 要如何判斷 DRIVE_REMOVABLE 是 Floppy 或 USB 隨身碟 or USB HD ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2008-03-12 16:49:47, 註解 無‧
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
讀的到產品的 ID code 的話, 應該就知道插入了什麼. 就像安裝 driver 時會知道裝了什麼硬體. ( 品牌-產品名稱 ).
FYI. ===================引 用 pcboy 文 章=================== 要如何判斷 DRIVE_REMOVABLE 是 Floppy 或 USB 隨身碟 or USB HD ?
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
請問您得到的資訊有那些?
===================引 用 pcboy 文 章=================== 請教一下, 要用甚麼 Function 去查 ID ? 小弟後來發現 GetVolumeInformationA 可以查出進一步資訊 (上面程式碼更新了) 但是取得的資訊不包含 ID
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!? |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
View 了一些文件. 事實上你接了USB device 到電腦時, 其實它所有描述 data 已經 scan 到電腦裡了, 只是你沒有把它讀出來.
上面是我電腦用 USB Device View 所看到的, 程式是M$ 1999 開發時用的吧, 我沒有 source code. 從上面就可以清楚的看到我接了2個 USB device. (無線滑鼠 無線網卡) 而且知道接在那一個Host controller 的那一個 port 右邊就可以看到它是什麼Device, 什麼廠牌, 速度, 資料長度............等. 安裝 driver 只是提供user一個function去存取這個device.(你有閒的話這段自己寫就不用裝driver) FYI.
------
------------------------------------------------------------------------- 走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
編輯記錄
㊣ 重新編輯於 2008-03-12 23:05:52, 註解 無‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
感謝 ㊣ PM 給小弟的訊息 :
******************************************************************* for usb 您可以找一下有無GetDeforbiddenor 或 GetDeviceDesc 的相關function. ******************************************************************* Google "GetDeforbiddenor" 居然只有一篇, API 名稱正確??? Delphi.ktop討論區- 如何知道USB2.0裝置被判為插入USB1.1 Hub http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=62960 Google "GetDeviceDesc" 雖然有些資料 但 Google "GetDeviceDesc site:microsoft.com" 沒有半篇, API 名稱正確???
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
http://msdn2.microsoft.com/en-us/library/aa364993(VS.85).aspx
BOOL WINAPI GetVolumeInformation( __in_opt LPCTSTR lpRootPathName, __out LPTSTR lpVolumeNameBuffer, __in DWORD nVolumeNameSize, __out_opt LPDWORD lpVolumeSerialNumber, __out_opt LPDWORD lpMaximumComponentLength, __out_opt LPDWORD lpFileSystemFlags, __out LPTSTR lpFileSystemNameBuffer, __in DWORD nFileSystemNameSize ); 正在研究這個Source Code http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=38548 其實從 Registry 是可以查到某些資訊, 但是問題是以 GetLogicalDriveStrings 和從 Registry 得到的資訊該如何對應起來 ===================引 用 ㊣ 文 章=================== 請問您得到的資訊有那些? ===================引 用 pcboy 文 章=================== 請教一下, 要用甚麼 Function 去查 ID ? 小弟後來發現 GetVolumeInformationA 可以查出進一步資訊 (上面程式碼更新了) 但是取得的資訊不包含 ID
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
這個很像從 Registry 撈出來的資料, 但是沒有包含 磁碟代號
===================引 用 ㊣ 文 章=================== View 了一些文件. 事實上你接了USB device 到電腦時, 其實它所有描述 data 已經 scan 到電腦裡了, 只是你沒有把它讀出來. 上面是我電腦用 USB Device View 所看到的, 程式是M$ 1999 開發時用的吧, 我沒有 source code. 從上面就可以清楚的看到我接了2個 USB device. (無線滑鼠 無線網卡) 而且知道接在那一個Host controller 的那一個 port 右邊就可以看到它是什麼Device, 什麼廠牌, 速度, 資料長度............等. 安裝 driver 只是提供user一個function去存取這個device.(你有閒的話這段自己寫就不用裝driver) FYI.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
Google 下面資訊中....
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 下你可以找到 磁碟機 名稱 及他屬於那一個儲存媒體的資訊(內含GUID) GetVolumeNameForVolumeMountPoint GetVolumePathNamesForVolumeName SetupDiGetInterfaceDeviceDetail DeviceIoControl HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USBSTOR\之下就是有usb的裝置HardwareID
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
dt520
一般會員 發表:11 回覆:61 積分:14 註冊:2003-05-13 發送簡訊給我 |
我也想知道!
找了很久,找到一个,不是DELPHI语言的,应该可行。 同时希望能译成DELPHI语言的。 在Win NT/2000/XP下, 可以用下面的方法(nHD从0开始): void GetHDPartition(int nHD) { char buf0[33]; char buf1[128]; char buf2[2048]; DWORD dwNum; HANDLE hDevice; PARTITION_INFORMATION pi; DRIVE_LAYOUT_INFORMATION* pdli; wsprintf(buf0, "\\\\.\\PHYSICALDRIVE%d", nHD); hDevice = CreateFile(buf0, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hDevice==(HANDLE)-1) { ShowMessage(SysErrorMessage(GetLastError())); return; } pdli = (DRIVE_LAYOUT_INFORMATION*)buf2; memset(buf2, 0, sizeof(buf2)); DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT, NULL, 0, buf2, sizeof(buf2), &dwNum, NULL); CloseHandle(hDevice); GetLogicalDriveStrings(sizeof(buf1), buf1); for(char* s=buf1; *s!=0; s =strlen(s) 1) { if (GetDriveType(s)!=DRIVE_FIXED) continue; wsprintf(buf0, "\\\\.\\%c:", *s); hDevice = CreateFile(buf0, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice==(HANDLE)-1) continue; if (!DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &pi, sizeof(pi), &dwNum, NULL)) { CloseHandle(hDevice); continue; } for(int n=0; n if (memcmp(pdli->PartitionEntry n,&pi, 2*sizeof(LARGE_INTEGER))==0) { MessageBox(0, s, "是指定硬盘上的一个分区", MB_OK); break; } } CloseHandle(hDevice); } } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |