Array
(
)

Testar Pen-Drive

Jener
   - 06 dez 2005

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


Adriano Santos
   - 06 dez 2005


Citação:
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.


Michael
   - 06 dez 2005

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


Edilcimar
   - 06 dez 2005

je ne parle pas française


Luizreberte
   - 29 jul 2006

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


Micheus
   - 29 jul 2006

Eu também ne parle pas française, 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]delphifr_source_pendrive.zip[/url]


Nerdex
   - 30 jul 2006

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:

#Código

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



Michael
   - 02 ago 2006

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 WM_DEVICECHANGE enviada pelo Windows para todas as janelas abertas. Vejam um exemplo:

Inicie uma nova aplicação Win32 e coloque no formulário um componente TMemo. Configure suas propriedades Align para alClient; ReadOnly para True e ScrollBars para ssVertical. Em seguida, adicione o código abaixo logo acima da declaração da classe do form:
#Código

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 private da classe do formulário a assinatura do método tratador de WM_DEVICECHANGE:

#Código
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;


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

#Código
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]));
end;
DBT_DEVICEREMOVECOMPLETE:
begin
if IsStorageDevice then
Memo1.Lines.Add(Format(´Pen drive desconectado (Unidade ¬s:\)´, [GetDriveLetter]));
end;
end;
end;


A função auxiliar GetDriveLetter 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, IsStorageDevice, 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 DEV_BROADCAST_HDR e DEV_BROADCAST_VOLUME 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


Leitorbinario
   - 02 ago 2006

Bom.


Marco Salles
   - 03 ago 2006

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


Citação:
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


Rodc
   - 15 ago 2006

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?


Acpaixao
   - 08 ago 2007

Caro Michael,

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

Grato,
Antonio Carlos




Citação:
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 WM_DEVICECHANGE enviada pelo Windows para todas as janelas abertas. Vejam um exemplo:

Inicie uma nova aplicação Win32 e coloque no formulário um componente TMemo. Configure suas propriedades Align para alClient; ReadOnly para True e ScrollBars para ssVertical. Em seguida, adicione o código abaixo logo acima da declaração da classe do form:
#Código

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 private da classe do formulário a assinatura do método tratador de WM_DEVICECHANGE:

#Código
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;


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

#Código
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]));
end;
DBT_DEVICEREMOVECOMPLETE:
begin
if IsStorageDevice then
Memo1.Lines.Add(Format(´Pen drive desconectado (Unidade ¬s:\)´, [GetDriveLetter]));
end;
end;
end;


A função auxiliar GetDriveLetter 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, IsStorageDevice, 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 DEV_BROADCAST_HDR e DEV_BROADCAST_VOLUME 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


Acpaixao
   - 08 ago 2007

Caros,

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

Grato,
Antonio Carlos


Onjahyr
   - 13 mar 2009

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 USB, 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.