[Delphi]Wykrywanie podpięcia pendriva

0

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

0
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.

0

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.

0

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.

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1