Testar Pen-Drive

06/12/2005

Como fazer para verificar se minha Pen-Drive está conectada e/ou ativa?


Jener

Respostas

06/12/2005

Adriano Santos

Como fazer para verificar se minha Pen-Drive está conectada e/ou ativa?


Difícil, levando em consideração que o Pen-Drive é ativado através de uma porta USB não é possível você saber em qual porta ele está presente, a menos que consiga ´scanear´ todas as portas do seu PC.


Responder Citar

06/12/2005

Michael

Olá!

É possível sim, ser notificado quando um dispositivo USB é conectado/desconectado do PC.

[url=http://www.delphifr.com/code.aspx?id=29140]Neste link[/url], vc pode ver um exemplo, em francês, de como saber se um pen drive, flash mem, hdd, ou qualquer dispositivo USB de armazenamento foi conectado.

[]´s


Responder Citar

06/12/2005

Edilcimar

je ne parle pas française


Responder Citar

29/07/2006

Luizreberte

bem se alguem pegou o fonte poderia enviar no email luizreberte@gmail.com


Responder Citar

29/07/2006

Micheus

Eu também [i:08a1dc83be]ne parle pas française[/i:08a1dc83be], mas como também tinha interesse, passei pela encrenca de me cadastrar (em francês).:D
Baixei e postei aqui -> [url=http://www.4shared.com/dir/573206/649e0251/Progamacao.html][b:08a1dc83be]delphifr_source_pendrive.zip[/b:08a1dc83be][/url]


Responder Citar

30/07/2006

Nerdex

Meu MP4 Foston Slim, show de bola, diga-se de passagem, foi detectado com sucesso! Veja a mensagem do ´evento OnPlugin´, em francês, resultante do código demo:

Connection du périphérique !

DeviceID :F:\
Nom du Volume :
Système de fichiers :FAT32
Numéro de série :3630789620
Taille totale :2.023.888 Kilo-octets
Disponible :781.648 Kilo-octets



Responder Citar

02/08/2006

Michael

Olá a todos!

Como recebi emails sobre como fazer esse detecção, estou postando um pequeno tutorial. Busquei na documentação da MSDN as constantes corretas para tornar mais legível o código.

Para detectar a presenção de um dispositvo de armazenamento, deve-se monitorar a mensagem [b:ff938b1004]WM_DEVICECHANGE [/b:ff938b1004]enviada pelo Windows para todas as janelas abertas. Vejam um exemplo:

Inicie uma nova aplicação Win32 e coloque no formulário um componente [b:ff938b1004]TMemo[/b:ff938b1004]. Configure suas propriedades [b:ff938b1004]Align [/b:ff938b1004]para [b:ff938b1004]alClient[/b:ff938b1004]; [b:ff938b1004]ReadOnly [/b:ff938b1004]para [b:ff938b1004]True [/b:ff938b1004]e [b:ff938b1004]ScrollBars [/b:ff938b1004]para [b:ff938b1004]ssVertical[/b:ff938b1004]. Em seguida, adicione o código abaixo logo acima da declaração da classe do form:
 const
  DBT_DEVICEARRIVAL        = $8000;
  DBT_DEVICEREMOVECOMPLETE = $8004;

  DBT_DEVTYP_VOLUME = $0002;

type
  PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR;
  TDEV_BROADCAST_HDR = packed record
   dbch_size,
   dbch_devicetype,
   dbch_reserved: DWORD;
  end;

  PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME;
  TDEV_BROADCAST_VOLUME = packed record
   dbcv_size,
   dbcv_devicetype,
   dbcv_reserved,
   dbcv_unitmask: DWORD;
   dbcv_flags: WORD;
  end;

  TForm1 = class(TForm)
(...)


Essas constantes e estruturas são necessárias para se traduzir as informações que vêm junto com a mensagem. Agora, insira na seção [b:ff938b1004]private [/b:ff938b1004]da classe do formulário a assinatura do método tratador de WM_DEVICECHANGE:

procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;


Por fim, implemente este método como mostrado a seguir:

procedure TForm1.WMDeviceChange(var Msg: TMessage);

  function GetDriveLetter: string;
  begin
    Result := Char(Trunc(Ln(PDEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_unitmask) / Ln(2)
      + Ord(´A´))));
  end;

  function IsStorageDevice: Boolean;
  begin
    Result := (PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME)  and
      (PDEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_flags = 0);
  end;

begin
  case Msg.WParam of
    DBT_DEVICEARRIVAL:
      begin
        if IsStorageDevice then
          Memo1.Lines.Add(Format(´Pen drive conectado (Unidade ¬s:\)´, [GetDriveLetter&93;));
      end;
    DBT_DEVICEREMOVECOMPLETE:
      begin
        if IsStorageDevice then
          Memo1.Lines.Add(Format(´Pen drive desconectado (Unidade ¬s:\)´, &91;GetDriveLetter&93;));
      end;
  end;
end;


A função auxiliar [b:ff938b1004]GetDriveLetter [/b:ff938b1004]serve para se obter a unidade de disco utilizada pelo dispositivo conectado, utilizando as informações vindas dentro da mensagem enviada pelo sistema operacional. Isso é feito através de um cálculo, que neste exemplo foi baseado em logaritmos, mas que também pode ser feito pode bitwise operations. Com a letra do drive em mãos, é possível obter outros dados do volume, como o seu nome, ou o espaço livre.
A outra função, [b:ff938b1004]IsStorageDevice[/b:ff938b1004], verifica se foi realmente um pen drive (ou outro dispositivo de armazenamento). Isso é importante porque a mensagem WM_DEVICECHANGE também é disparada quando outros tipos de mídia, como um CD ou DVD, são conectados ou desconectados – no caso do CD/DVD, inseridos ou removidos, respectivamente. Pesquise no site da MSDN por esta mensagem e pelas estruturas [b:ff938b1004]DEV_BROADCAST_HDR[/b:ff938b1004] e [b:ff938b1004]DEV_BROADCAST_VOLUME[/b:ff938b1004] para obter mais informações sobre o assunto.
Execute a aplicação, conecte e desconecte um pen drive em alguma porta USB disponível e veja o “log” do processo no memo da aplicação.

[]´s


Responder Citar

02/08/2006

Leitorbinario

Bom.


Responder Citar

03/08/2006

Marco Salles

eu , quando precisar de alguma coisa ´cabeluda´ igual a esta ja sei o que vou fazer...

Vou pedir para : Minha mãe , meu pai , meus irmaos , minhas tias , meus primos , minha võ , meu vô ,meus cunhados, amigos , familares ,etc... Mandar um montão de email para voce.......................


:lol: :lol: :lol: :lol: :lol: :lol:

Show de bola....Parabens :P :P :P


Responder Citar

15/08/2006

Rodc

Eu tentei fazer o código acima com um instrumento USB que eu tenho e ele me retorna apenas a mensagem DBT_DEVNODES_CHANGED, nunca a DBT_DEVICEARRIVAL e DBT_DEVICEREMOVECOMPLETE.
Alguém tem alguma ideía de como passar por isto?


Responder Citar

08/08/2007

Acpaixao

Caro Michael,

Tem como fazer uma função para desconectar o pendrive pelo Delphi?

Grato,
Antonio Carlos



Olá a todos! Como recebi emails sobre como fazer esse detecção, estou postando um pequeno tutorial. Busquei na documentação da MSDN as constantes corretas para tornar mais legível o código. Para detectar a presenção de um dispositvo de armazenamento, deve-se monitorar a mensagem [b:285013694e]WM_DEVICECHANGE [/b:285013694e]enviada pelo Windows para todas as janelas abertas. Vejam um exemplo: Inicie uma nova aplicação Win32 e coloque no formulário um componente [b:285013694e]TMemo[/b:285013694e]. Configure suas propriedades [b:285013694e]Align [/b:285013694e]para [b:285013694e]alClient[/b:285013694e]; [b:285013694e]ReadOnly [/b:285013694e]para [b:285013694e]True [/b:285013694e]e [b:285013694e]ScrollBars [/b:285013694e]para [b:285013694e]ssVertical[/b:285013694e]. Em seguida, adicione o código abaixo logo acima da declaração da classe do form:
 const
  DBT_DEVICEARRIVAL        = $8000;
  DBT_DEVICEREMOVECOMPLETE = $8004;

  DBT_DEVTYP_VOLUME = $0002;

type
  PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR;
  TDEV_BROADCAST_HDR = packed record
   dbch_size,
   dbch_devicetype,
   dbch_reserved: DWORD;
  end;

  PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME;
  TDEV_BROADCAST_VOLUME = packed record
   dbcv_size,
   dbcv_devicetype,
   dbcv_reserved,
   dbcv_unitmask: DWORD;
   dbcv_flags: WORD;
  end;

  TForm1 = class(TForm)
(...)
Essas constantes e estruturas são necessárias para se traduzir as informações que vêm junto com a mensagem. Agora, insira na seção [b:285013694e]private [/b:285013694e]da classe do formulário a assinatura do método tratador de WM_DEVICECHANGE:
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
Por fim, implemente este método como mostrado a seguir:
procedure TForm1.WMDeviceChange(var Msg: TMessage);

  function GetDriveLetter: string;
  begin
    Result := Char(Trunc(Ln(PDEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_unitmask) / Ln(2)
      + Ord(´A´))));
  end;

  function IsStorageDevice: Boolean;
  begin
    Result := (PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME)  and
      (PDEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_flags = 0);
  end;

begin
  case Msg.WParam of
    DBT_DEVICEARRIVAL:
      begin
        if IsStorageDevice then
          Memo1.Lines.Add(Format(´Pen drive conectado (Unidade ¬s:\)´, [GetDriveLetter&93;));
      end;
    DBT_DEVICEREMOVECOMPLETE:
      begin
        if IsStorageDevice then
          Memo1.Lines.Add(Format(´Pen drive desconectado (Unidade ¬s:\)´, &91;GetDriveLetter&93;));
      end;
  end;
end;
A função auxiliar [b:285013694e]GetDriveLetter [/b:285013694e]serve para se obter a unidade de disco utilizada pelo dispositivo conectado, utilizando as informações vindas dentro da mensagem enviada pelo sistema operacional. Isso é feito através de um cálculo, que neste exemplo foi baseado em logaritmos, mas que também pode ser feito pode bitwise operations. Com a letra do drive em mãos, é possível obter outros dados do volume, como o seu nome, ou o espaço livre. A outra função, [b:285013694e]IsStorageDevice[/b:285013694e], verifica se foi realmente um pen drive (ou outro dispositivo de armazenamento). Isso é importante porque a mensagem WM_DEVICECHANGE também é disparada quando outros tipos de mídia, como um CD ou DVD, são conectados ou desconectados – no caso do CD/DVD, inseridos ou removidos, respectivamente. Pesquise no site da MSDN por esta mensagem e pelas estruturas [b:285013694e]DEV_BROADCAST_HDR[/b:285013694e] e [b:285013694e]DEV_BROADCAST_VOLUME[/b:285013694e] para obter mais informações sobre o assunto. Execute a aplicação, conecte e desconecte um pen drive em alguma porta USB disponível e veja o “log” do processo no memo da aplicação. []´s



Responder Citar

08/08/2007

Acpaixao

Caros,

Tem como fazer uma função para desconectar o pendrive pelo Delphi?

Grato,
Antonio Carlos


Responder Citar

13/03/2009

Onjahyr

Postei uma dúvida de como detectar o PenDrive, aqui está a resposta, mas...

Isso funciona quando o aplicativo já foi executado e, a pessoa, insere um PenDrive. O problema, que estou tentando descobrir é, se o PenDrive já estiver inserido na [b:ca78def0cc]USB[/b:ca78def0cc], e o programa, ao iniciar, faça a detecção para saber se o bentido do PenDrive encontra-se detectado e qual a unidade ele se encontra?

Como fazer para re-detectar a existência do PenDrive?

Alguém sabe informar isso?


Grato.


Responder Citar