RemycinLu
一般會員

 發表:34 回覆:20 積分:10 註冊:2003-10-02
發送簡訊給我
|
延續這篇文章的問題,雖然還沒有人回應 ![]()
>
|
dllee
站務副站長
    
 發表:321 回覆:2519 積分:1711 註冊:2002-04-15
發送簡訊給我
|
引言:
延續這篇文章的問題,雖然還沒有人回應
>
< face="Verdana, Arial, Helvetica">
您原來的問題我不會,而這個問題,如果是在 2K/XP 下,只要在第一次 PnP 此 USB 儲存裝置後,在連線的狀態下,開啟
「我的電腦」→右鍵選單的內容→在電腦管理中選「磁碟管理」
在磁碟管理中可以自行安排新的儲存裝罝的磁碟機代號,像是 O: X: Z: 等等都可以,設定完後,即使拔去 USB 裝置或關機再重開,日後只要同一個 USB 儲存裝置再連上, 2K/XP 會自動配給同一個磁碟機代號。 不知道您原問題的要求是什麼,如果只需要判斷同一個 USB 裝置有沒有連上,在 2K/XP 下則可以直接去試開指定磁碟機的特定檔,如果開不起來,就是沒連上,如果開起來,就是連上了。 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------ http://www.ViewMove.com
|
roger128
初階會員

 發表:27 回覆:45 積分:25 註冊:2002-08-29
發送簡訊給我
|
~^^~
參考以下網址~~~~
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxconsampleusbdevicedrivers.asp 是你要的東東ㄇ~~
|
RemycinLu
一般會員

 發表:34 回覆:20 積分:10 註冊:2003-10-02
發送簡訊給我
|
感謝dllee和roger128兩位大大的回答,但很遺憾都不適用,可能是因為我表達
得不猜楚的原因,我現在有一個應用程式,在這個應用程式啟動的時候,就必須
從程式中判斷特定的USB儲存裝置是否已經存在作業系統裡面,如果存在的話,
就要取得這個USB儲存裝置的磁碟機代號,以供特殊用途使用,我已經找了很多
資料,但還是不知道要怎麼做(作業系統Windows 98,ME,NT,2000),再請各位大
大幫幫忙,感謝大家
|
mkbobo
一般會員

 發表:4 回覆:68 積分:19 註冊:2003-04-10
發送簡訊給我
|
關於你的問題可以參考以下
http://delphi.ktop.com.tw/topic.php?topic_id=27077 讀取windows的裝置不外乎就是使用這個 DeviceIoControl
不管是什麼裝置應該都可以得到
我順便附上以前我為了找,一些儲存裝置所寫的程式,問我程式哪裡找的
當然就是參考上面哪篇的大作拉~~^_^
什麼上傳範例??~~我想就不過是拉兩個元件 TButton 和 TMemo
我想你應該能自行剪貼到你需要的地方,應該可以對你有所幫助 ![]() < class="code">
//.cpp
#include
#pragma hdrstop
#include
#include
#include
#pragma package(smart_init)
#pragma resource "*.dfm"
#define INTERFACE_DETAIL_SIZE (1024)
#define MAX_DEVICE 16
TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
} int __fastcall TForm1::GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
HDEVINFO hDevInfoSet;
SP_DEVICE_INTERFACE_DATA ifdata;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
int nCount;
BOOL bResult; hDevInfoSet = ::SetupDiGetClassDevs(lpGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if(hDevInfoSet == INVALID_HANDLE_VALUE)
{
return 0;
} pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE); pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); nCount = 0;
bResult = TRUE; while (bResult)
{
ifdata.cbSize=sizeof(ifdata); bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet,
NULL,
lpGuid,
(ULONG)nCount,
&ifdata); if(bResult)
{
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet,
&ifdata,
pDetail,
INTERFACE_DETAIL_SIZE,
NULL,
NULL); if(bResult)
{
::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
Memo1->Lines->Add(pDetail->DevicePath);
nCount ;
}
}
} ::GlobalFree(pDetail); ::SetupDiDestroyDeviceInfoList(hDevInfoSet); return nCount;
} void __fastcall TForm1::Button1Click(TObject *Sender)
{ HANDLE hDevice; String strInfo;
int nDevice;
int i,j;
char* szDevicePath[MAX_DEVICE];
LPGUID lpGuid[] = {
(LPGUID)&DiskClassGuid,
(LPGUID)&CdRomClassGuid,
(LPGUID)&StoragePortClassGuid,
(LPGUID)&MediumChangerClassGuid
}; for(i=0 ; i < MAX_DEVICE ; i ) szDevicePath[i]=new char[256]; for(i=0; i < sizeof(lpGuid) / sizeof(LPGUID) ; i )
{
nDevice=GetDevicePath(lpGuid[i], szDevicePath);
} for(i=0 ; i < MAX_DEVICE ; i ) delete []szDevicePath[i]; }
.h
int __fastcall GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath); // <<在.h 加上這行
|
RemycinLu
一般會員

 發表:34 回覆:20 積分:10 註冊:2003-10-02
發送簡訊給我
|
非常感謝mkbobo大大的回答,解決了我另外一個問題
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38327
能否麻煩mkbobo大大到那篇文章再重新發表一次,好讓我給你答題得分 ![]() 可是,這個問題仍然沒有得到完全的解決
雖然現在已經可以判斷 > >
|
RemycinLu
一般會員

 發表:34 回覆:20 積分:10 註冊:2003-10-02
發送簡訊給我
|
感謝mkbobo大大在這篇文章的回答,讓我又學到了新的東西 ![]()
>
如果把 >
就算是回傳的 >
除了這個方法,還有其他的方法嗎?請 >
|
mkbobo
一般會員

 發表:4 回覆:68 積分:19 註冊:2003-04-10
發送簡訊給我
|
我想我已經找到方法解決了
但是我這次想請你先做做功課 ![]()
方法我不知道是不是最快的但是可以解決
因為有 >
感謝>比對 你就可以找到他到底是哪一個磁碟機名稱 阿功課是啥 就是我已經幫你找到可以解決的方法拉 但沒有程式碼
或許你可以將最後的結果 放上來告訴大家~~^^
|
RemycinLu
一般會員

 發表:34 回覆:20 積分:10 註冊:2003-10-02
發送簡訊給我
|
感謝mkbobo大大的再次提醒,其實在我問這兩個問題之前,我已經用"USB"和
"USBSTOR"這兩個關鍵字,搜尋過HKEY_LOCAL_MACHINE下的所有機碼,因此,也
知道所有有關我的USB儲存裝置機碼會出現的地方,當然,也包括mkbobo大大所
說的那個Key,但是,我的程度真的太差了< >,一直找不到每個機碼之間的關
聯性,所以才會來發問的< >,另外,我也有發現在MSDN裡面有這兩個function
可用GetVolumeNameForVolumeMountPoint/GetVolumePathNamesForVolumeName
但是,好像都不支援Windows98,ME,另一方面是不熟,所以就沒有繼續試了,不
知道mkbobo大大所說的方法能夠同時在Windows98,ME,2000,XP都適用嗎? ![]()
希望 >
|
jackkcg
站務副站長
    
 發表:891 回覆:1050 積分:848 註冊:2002-03-23
發送簡訊給我
|
先偵測reg的
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USBSTOR\Disk&Ven_HITACHI_&Prod_DK225A-21&Rev_00B0\11100E000038D92FX&0++++++++++++++++++++++++++++
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USBSTOR\之下就是有usb的裝置
HardwareID
一共有數個位置要知道 我看是要自己去查比較ez

會一直說這個位置是因為上圖 資訊 的判斷
usb有霹靂碟也有抽取盒 更有cd rom 那一個才是可寫入的disk裝置
這2個圖大家應該都看過 在reg中還有屬性是虛擬裝置usb也是所以必須多個位置
加總之後判斷 否則連虛擬光碟你也判讀錯誤 ktop下有幾個硬體資訊範例
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30705
這是其中一個
自己再修正自己所要的數據 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起 發表人 - jackkcg 於 2003/10/08 00:57:46
------ **********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好
Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
|
mkbobo
一般會員

 發表:4 回覆:68 積分:19 註冊:2003-04-10
發送簡訊給我
|
引言:當然,也包括mkbobo所
說的那個Key,但是,我的程度真的太差了,一直找不到每個機碼之間的關
聯性,所以才會來發問的,另外 再給你一點提示 你說的關聯性就是我說可以解決的方法
我說的哪個key 裡面有包含 邏輯磁碟機名稱 A: C: D: ...
他的後面有一串 BINARY 他的類型是 REG_BINARY 這個東西裡面是用寬字元儲存這個儲存媒體的詳細內容 就是我上面哪段程式的內容所解析出來的其中一個
所以你需要做一件事 就是比對他們 這樣就可以得到正確的磁碟機代號 這樣你了解了嗎 如果你對 TRegister 怎麼使用 不清楚 你可以搜尋一下這個網站 你會得到他使用的方法的 還有一件事 就是你說的98 ME 可不可以用 我沒有用98 me 所以沒辦法幫你做驗證 但是呢 如果98 me 上有同樣的 key(HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices ) 我想一定就是沒問題的了
因為 我使用的func 他都是支援98 及meㄉ 最後 如果你對有沒有支援感到有疑問 那是不是去試看看就知道了呢~~< > >>>這是一個好方法 在試一下 一試在試 做不成 在試一下< ><<<
|
pcboy
版主
    
 發表:177 回覆:1838 積分:1463 註冊:2004-01-13
發送簡訊給我
|
下面 include 的檔案名稱不見了, 測試結果應該是 #include <setupapi.h> #include <winioctl.h> ===================引 用 mkbobo 文 章=================== //.cpp
#include
#pragma hdrstop
#include
#include
#include
------ 能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!
子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2008-03-13 11:19:47, 註解 無‧
|