全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1141
推到 Plurk!
推到 Facebook!

判斷磁碟機介面的 C code 轉delphi code 後不work

尚未結案
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-31 04:23:21 IP:61.64.xxx.xxx 未訂閱
http://www.codeproject.com/w2k/usbdisks.asp http://www.codeproject.com/w2k/usbdisks/usbdisks_src.zip 可以下載 一磁碟代號判斷 連接介面的 C code 我變開始轉換 delphi code ... 但應該是型態有些轉不太對 所以都不work 我轉換過後的delphi code 如下 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IOCTL; type TSTORAGE_BUS_TYPE = ( BusTypeUnknown = $00, BusTypeScsi , BusTypeAtapi , BusTypeAta, BusType1394 , BusTypeSsa , BusTypeFibre , BusTypeUsb , BusTypeRAID , BusTypeMaxReserved = $7F); // STORAGE_BUS_TYPE = set of TSTORAGE_BUS_TYPE; TSTORAGE_PROPERTY_ID = (StorageDeviceProperty=0, StorageAdapterProperty, StorageDeviceIdProperty); // STORAGE_PROPERTY_ID = set of TSTORAGE_PROPERTY_ID; TSTORAGE_QUERY_TYPE = (PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined); // STORAGE_QUERY_TYPE = set of TSTORAGE_QUERY_TYPE; TSTORAGE_PROPERTY_QUERY = record PropertyId: TSTORAGE_PROPERTY_ID; QueryType: TSTORAGE_QUERY_TYPE; AdditionalParameters: array of Byte; end; TSTORAGE_DEVICE_DESCRIPTOR = record Version: longint; //4 Size: longint; //4 DeviceType: byte; //1 DeviceTypeModifier: byte; //1 RemovableMedia: BOOLEAN; //1 CommandQueueing: BOOLEAN; //1 VendorIdOffset: longint; //4 ProductIdOffset: longint; //4 ProductRevisionOffset: longint; //4 SerialNumberOffset: longint; //4 BusType: TSTORAGE_BUS_TYPE; //1 RawPropertiesLength: longint; //4 RawDeviceProperties: array of Byte; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; STORAGE_DEVICE_DESCRIPTOR: TSTORAGE_DEVICE_DESCRIPTOR; implementation {$R *.dfm} Function CTL_CODE(lngDeviceType:word; lngFunction:word; lngMethod:word; lngAccess:word):DWORD; begin lngFunction := Dword($0500); lngMethod := 0; lngAccess :=0; Result := (IOCTL_STORAGE_BASE shl 16) or (lngAccess shl 14) or (lngFunction shl 2) or (lngMethod); end; function GetDisksProperty(var hDevice: THandle; var pDevDesc: TSTORAGE_DEVICE_DESCRIPTOR ): Boolean; var QUERY: TSTORAGE_PROPERTY_QUERY; bResult: Boolean; dwOutBytes: Dword; begin QUERY.PropertyId := StorageDeviceProperty; QUERY.QueryType := PropertyStandardQuery; bResult := DeviceIoControl(hDevice, // device handle CTL_CODE(0,Dword($0500),0,0), // info of device property @Query, sizeof(TSTORAGE_PROPERTY_QUERY), // input data buffer @pDevDesc, pDevDesc.Size, // output data buffer dwOutBytes, // out's length nil); Result := bResult; end; procedure TForm1.Button1Click(Sender: TObject); var sDrv: Char; sDrvLetter: String; hDevice : THandle; szBuf: PChar; pDevDesc: TSTORAGE_DEVICE_DESCRIPTOR; begin for sDrv := 'A' to 'Z' do begin sDrvLetter := sDrv ':\'; Case GetDriveType(PChar(sDrvLetter)) of DRIVE_FIXED : begin hDevice := CreateFile(PChar('\\.\' LowerCase(sDrv) ':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (hDevice <> INVALID_HANDLE_VALUE) then begin SetLength(pDevDesc.RawDeviceProperties, 512); pDevDesc.Size := SizeOf(pDevDesc) 507; if(GetDisksProperty(hDevice, pDevDesc)) then if pDevDesc.BusType = BusTypeUsb then ShowMessage('test'); end; CloseHandle(hDevice); end; end; end; end; end. GetDisksProperty function 回傳的值一直都是false DeviceIoControl 帶入的參數有問題 發表人 - snooze 於 2004/05/31 04:25:55
------
Nice to meet u
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-01 08:48:51 IP:202.39.xxx.xxx 未訂閱
參考: http://delphi.ktop.com.tw/topic.php?topic_id=39850 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39986 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40017
Snooze
一般會員


發表:18
回覆:21
積分:7
註冊:2002-06-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-01 10:14:47 IP:61.220.xxx.xxx 未訂閱
引言: 參考: http://delphi.ktop.com.tw/topic.php?topic_id=39850 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39986 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40017
hagar 您好 謝謝您的回覆 剛剛看了您給的三個網址 內容主要是說明當USB Plus In 即時Message 接收得知的功能 其實我的問題是再下一步,判斷得知外接介面的媒體 比如外接磁碟插入 大母哥 插入 顯示 Removeable Type 外接硬碟插入 顯示 Fixed Type 內接硬碟 外接硬碟 都為 Fixed Type 雖然都是Fixed 但可以得知 他的interface 為USB 或是IEEE1394 http://www.codeproject.com/w2k/usbdisks.asp http://www.codeproject.com/w2k/usbdisks/usbdisks_src.zip 這邊的 C Code 我用visual c 試過 真的是可以抓的道介面類型 但轉delphi code..就不work 了,一定是那邊沒注意到 看了他的Type定義有下面這幾個 BusTypeUnknown = 0x00, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID, BusTypeMaxReserved = 0x7F 發表人 - snooze 於 2004/06/01 10:17:27
------
Nice to meet u
系統時間:2024-05-16 10:07:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!