Testar Pen-Drive
Como fazer para verificar se minha Pen-Drive está conectada e/ou ativa?
Jener
Curtidas 0
Respostas
Adriano Santos
06/12/2005
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.
GOSTEI 0
Michael
06/12/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
É 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
GOSTEI 0
Edilcimar
06/12/2005
je ne parle pas française
GOSTEI 0
Luizreberte
06/12/2005
bem se alguem pegou o fonte poderia enviar no email luizreberte@gmail.com
GOSTEI 0
Micheus
06/12/2005
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]
Baixei e postei aqui -> [url=http://www.4shared.com/dir/573206/649e0251/Progamacao.html][b:08a1dc83be]delphifr_source_pendrive.zip[/b:08a1dc83be][/url]
GOSTEI 0
Nerdex
06/12/2005
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
GOSTEI 0
Michael
06/12/2005
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:
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:
Por fim, implemente este método como mostrado a seguir:
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
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])); end; DBT_DEVICEREMOVECOMPLETE: begin if IsStorageDevice then Memo1.Lines.Add(Format(´Pen drive desconectado (Unidade ¬s:\)´, [GetDriveLetter])); 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
GOSTEI 0
Leitorbinario
06/12/2005
Bom.
GOSTEI 0
Marco Salles
06/12/2005
eu , quando precisar de alguma coisa ´cabeluda´ igual a esta ja sei o que vou fazer...
:lol: :lol: :lol: :lol: :lol: :lol:
Show de bola....Parabens :P :P :P
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
GOSTEI 0
Rodc
06/12/2005
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?
Alguém tem alguma ideía de como passar por isto?
GOSTEI 0
Acpaixao
06/12/2005
Caro Michael,
Tem como fazer uma função para desconectar o pendrive pelo Delphi?
Grato,
Antonio Carlos
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:
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:
Por fim, implemente este método como mostrado a seguir:
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
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) (...)
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
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;
GOSTEI 0
Acpaixao
06/12/2005
Caros,
Tem como fazer uma função para desconectar o pendrive pelo Delphi?
Grato,
Antonio Carlos
Tem como fazer uma função para desconectar o pendrive pelo Delphi?
Grato,
Antonio Carlos
GOSTEI 0
Onjahyr
06/12/2005
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.
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.
GOSTEI 0