Testar Pen-Drive
06/12/2005
0
Jener
Posts
06/12/2005
Adriano Santos
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.
06/12/2005
Michael
É 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
29/07/2006
Luizreberte
29/07/2006
Micheus
Baixei e postei aqui -> [url=http://www.4shared.com/dir/573206/649e0251/Progamacao.html][b:08a1dc83be]delphifr_source_pendrive.zip[/b:08a1dc83be][/url]
30/07/2006
Nerdex
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
02/08/2006
Michael
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
03/08/2006
Marco Salles
:lol: :lol: :lol: :lol: :lol: :lol:
Show de bola....Parabens :P :P :P
15/08/2006
Rodc
Alguém tem alguma ideía de como passar por isto?
08/08/2007
Acpaixao
Tem como fazer uma função para desconectar o pendrive pelo Delphi?
Grato,
Antonio Carlos
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;
08/08/2007
Acpaixao
Tem como fazer uma função para desconectar o pendrive pelo Delphi?
Grato,
Antonio Carlos
13/03/2009
Onjahyr
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.
Clique aqui para fazer login e interagir na Comunidade :)