Hej!
Poszukuje sposobu na odczytanie litery (i w ogóle wykrycie) nowo podpiętego pendriva. Np. ktoś podepnie pendriva a program wie co to za litera dysku.
Proszę o odpowiedź i pozdrawiam
Rozwiązanie znalazłem pod tym adresem
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21552015.html
pelsta napisał(a)
Rozwiązanie znalazłem pod tym adresem
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21552015.html
No to mógłbyś wrzucić tutaj.
Proszę bardzo.
//Here is a complet sample project. Use a form and a label.
unit Unit1;
interface
uses
Windows, Messages, Classes, Forms, StdCtrls, Controls;
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
protected
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
public
{ Public declarations }
end;
// Device constants
const
DBT_DEVICEARRIVAL = $00008000;
DBT_DEVICEREMOVECOMPLETE = $00008004;
DBT_DEVTYP_VOLUME = $00000002;
// Device structs
type
_DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
DEV_BROADCAST_HDR = _DEV_BROADCAST_HDR;
TDevBroadcastHeader = DEV_BROADCAST_HDR;
PDevBroadcastHeader = ^TDevBroadcastHeader;
type
_DEV_BROADCAST_VOLUME = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
dbcv_unitmask: DWORD;
dbcv_flags: WORD;
end;
DEV_BROADCAST_VOLUME = _DEV_BROADCAST_VOLUME;
TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
PDevBroadcastVolume = ^TDevBroadcastVolume;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var lpdbhHeader: PDevBroadcastHeader;
lpdbvData: PDevBroadcastVolume;
dwIndex: Integer;
lpszDrive: String;
begin
// Perform inherited
inherited;
// Get the device notification header
lpdbhHeader:=PDevBroadcastHeader(Msg.lParam);
// Handle the message
lpszDrive:='Drive ';
case Msg.WParam of
DBT_DEVICEARRIVAL :
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex:=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex);
break;
end;
end;
Label1.Caption:=lpszDrive+' available';
end;
end;
DBT_DEVICEREMOVECOMPLETE:
begin
if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
lpdbvData:=PDevBroadcastVolume(Msg.lParam);
for dwIndex:=0 to 25 do
begin
if ((lpdbvData^.dbcv_unitmask shr dwIndex) = 1) then
begin
lpszDrive:=lpszDrive+Chr(65+dwIndex);
break;
end;
end;
Label1.Caption:=lpszDrive+' removed';
end;
end;
end;
end;
end.
Rozwiązanie jest dosyć długie, dlatego najlepiej wejść z pod google, bo wtedy jak zauważylem wątek
ma rozwinięte solucje pod koniec strony, a wchodząc normalnie z podanego linka są zwinięte, więć nie
wiem czy to tylko u mnie tak, czy u Was też tak jest. Najlepiej jest wchodzić z takiego linka na google.
Rzeczywiście tak jest.
Fajny trick, olesio.
To rozwiązanie skopiowałem w czerwcu 2008 za pomocą programu EverNote i dzięki temu mogłem podesłać je na forum.
Wtedy strona jakoś inaczej wyglądała.