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

請問如何寫USB隨身碟或外接硬碟插入時候, 對內容做些檢查的程式

缺席
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-01 11:13:44 IP:61.220.xxx.xxx 訂閱
小弟在 Delphi.KTop 搜尋瀏覽 USB 文章
也正在 Google 一些資訊
Google "delphi USB begin"
Google "delphi usb控件源碼"
Google "delphi usb範例"
Google "delphi USB"
某些Source Code重新Compile可能失敗,
或Compile成功但不能執行 (或許該去書店找書)
小弟想常駐一個程式, 當USB隨身碟或外接硬碟插入時候, 對隨身碟或外接硬碟內容做些檢查
小弟沒寫過 driver 或任何 USB 相關程式
用 Delphi 開發有甚麼注意事項 ?
Q:為何Delphi.KTop寫USB程式幾乎都用BCB, 而非Delphi
Q:是否要先安裝 Windows XP DDK ?
Q:Windows 2000或2003 DDK是否可以安裝在XP電腦上安裝?
Q:可以用 Delphi 7 Enterprise嗎? 還是建議用 Delphi 2007來開發?
Q:Delphi開發環境是否要先做甚麼設定? uses 甚麼東西?
Q:有人願意提供些可正常Compile和Run的範例程式嗎? THX
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-01 14:29:01 IP:61.220.xxx.xxx 訂閱
相關資訊

IOCTL_USB_GET_NODE_INFORMATION
DBT_DEVICEARRIVAL 及 DBT_DEVICEREMOVECOMPLETE...
DBT_DEVNODES_CHANGED
OnDeviceChange
WM_MESSAGEONDEVICE
WM_DEVICECHANGE

USB Code Firmware and Related Applications
http://www.lvr.com/usbcode.htm

外圍器件接口資料USB
http://www.akae.cn/ftp/ftpdown/akaftp/ÕûÀíǰµÄFTP×ÊÁÏĿ¼/ÍâΧÆ÷¼þ½ӿÚ×ÊÁÏ/usb/

USB I/O Programming Manual.pdf (VB, C)
http://www.delcom-eng.com/downloads/USBPRGMNL.pdf

驅動程式開發網
http://www.driverdevelop.com/first.html

我想做一個監控軟件,能夠監控USB上的設備的插拔情況(C)
http://soft.etcell.com/topicView.aspx?Id=5707
請問如何用VC寫一個監控USB接口是否插入MP3 ?
http://topic.csdn.net/t/20050614/13/4081250.html
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-11-01 14:39:43, 註解 無‧
pcboy 重新編輯於 2007-11-02 16:03:43, 註解 無‧
pcboy 重新編輯於 2007-11-02 16:07:11, 註解 無‧
pcboy 重新編輯於 2007-11-02 16:08:36, 註解 無‧
pcboy 重新編輯於 2007-11-02 16:37:55, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-05 15:45:52 IP:61.220.xxx.xxx 訂閱
小範例分享
[code cpp]
{
用 Registry 偵測 USB 儲存裝置數量
Delphi 7 Enterprise
參考 : http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=58642
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Registry;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Registry: TRegistry; //用於註冊表的訪問
USBCount: Integer;
begin
Registry :=TRegistry.Create;
with Registry do
begin
RootKey:=HKEY_Local_Machine;
If OpenKey('SYSTEM\CurrentControlSet\Services\USBSTOR\Enum',true) then
begin
//how many USB strorages we get
USBCount:= Registry.ReadInteger('Count'); //how many device we have now
Edit1.Text:='USB設備目前有 ' IntToStr(USBCount) ' 個';
end;
end;
end;
end.
[/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-05 16:32:48 IP:61.220.xxx.xxx 訂閱
再一種做法
[code cpp]
{
程式說明 : 用 WM_DEVICECHANGE 和 DBT_DEVICEARRIVAL 偵測 USB 儲存裝置的插拔
開發工具 : Delphi 7 Enterprise
參考 :
http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=58642
http://forums.adelavida.com/?Idx=delphi&Status=9865306168
http://www.amxku.net/?action=show&id=801
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
OldWindowProc: TWndMethod;
procedure FormWndProc(var Message: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation
{$R *.dfm}
uses
ShellApi;
const
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone

procedure TForm1.FormCreate(Sender: TObject);
begin
OldWindowProc:= WindowProc;
WindowProc := FormWndProc;
end;
procedure TForm1.FormWndProc(var Message: TMessage);
begin
OldWindowProc(Message);
if (Message.Msg=WM_DEVICECHANGE) then
begin
if (Message.WParam=DBT_DEVICEARRIVAL) then
begin
Memo1.Lines.Add('新插入了一項裝置!');
end;
if (Message.WParam=DBT_DEVICEREMOVECOMPLETE) then
begin
Memo1.Lines.Add('卸除了一項裝置!');
end;
end;
end;
end.
[/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-15 17:06:07 IP:61.220.xxx.xxx 訂閱

增加功能 : 顯示出剛剛插入的 USB Flash 磁碟代號

[code cpp]
{
程式說明 : 用 WM_DEVICECHANGE 和 DBT_DEVICEARRIVAL 偵測 USB 儲存裝置的插拔
並且顯示出剛剛插入的 USB Flash 磁碟代號
開發工具 : Delphi 7 Enterprise
參考 :
http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=58642
http://forums.adelavida.com/?Idx=delphi&Status=9865306168
http://www.amxku.net/?action=show&id=801
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
OldWindowProc: TWndMethod;
procedure FormWndProc(var Message: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation
{$R *.dfm}
uses
ShellApi;
const
DBT_DEVICEARRIVAL = $8000; // system detected a new device
DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
DBT_DEVTYP_VOLUME = $00000002; // logical volume
DBTF_MEDIA = $0001; // media comings and goings
type
PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR;
TDEV_BROADCAST_HDR = packed record
dbch_size : DWORD;
dbch_devicetype : DWORD;
dbch_reserved : DWORD;
end;
PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME;
TDEV_BROADCAST_VOLUME = packed record
dbcv_size : DWORD;
dbcv_devicetype : DWORD;
dbcv_reserved : DWORD;
dbcv_unitmask : DWORD;
dbcv_flags : WORD;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OldWindowProc:= WindowProc;
WindowProc := FormWndProc;
end;
procedure TForm1.FormWndProc(var Message: TMessage);
var
lpdb : PDEV_BROADCAST_HDR;
lpdbv : PDEV_BROADCAST_VOLUME;
unitmask:DWORD;
i: Integer;
begin
lpdb := PDEV_BROADCAST_HDR(Message.LParam);
OldWindowProc(Message);
if (Message.Msg=WM_DEVICECHANGE) then
begin
if (Message.WParam=DBT_DEVICEARRIVAL) then
begin
Memo1.Lines.Add('新插入了一項裝置!');
if lpdb.dbch_devicetype=DBT_DEVTYP_VOLUME then
begin
lpdbv := PDEV_BROADCAST_VOLUME(lpdb);
unitmask:=lpdbv.dbcv_unitmask;//取得 USB 隨身碟的磁碟代號
for i:=0 to 25 do //遍?磁?
begin
if Boolean(unitmask and $1)then
break;
unitmask := unitmask shr 1;
end;
Memo1.Lines.Add('USB 隨身碟的磁碟代號 : ' Char(Ord('A') i) );
end;
end;
if (Message.WParam=DBT_DEVICEREMOVECOMPLETE) then
begin
Memo1.Lines.Add('卸除了一項裝置!');
end;
end;
end;
end.
[/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2017-10-23 21:30:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!