Gravar um arquivo em varios pen drive

Programação Delphi e Pascal

Moderadores: 51, guest2003

Gravar um arquivo em varios pen drive

Mensagempor reginaldo » 21 Mai 2009 10:07

Olá pessoal,

Preciso detectar a quantidade de pen drives, e depois enviar o mesmo arquivo para ambos de uma só vez. è possível?

Quem puder me ajudar agradeço.
reginaldo
Bit
 
Mensagens: 30
Registrado em: 16 Out 2006 12:30

Mensagempor Wagner de Queiroz » 21 Mai 2009 12:24

todo pendrive é detectado como uma unidade de disco

A mensagem do windows WMDeviceChange é enviada a todas as aplicações quando acontece uma mudança de perifericos no windows, tipo conectar ou descontectar um hardware novo.

Uma mensagem do windows possui dois parametros w.Param e l.Param, ambos sao inteiros e denotam os parametros de uma mensagem.
em w.Param do WMDeviceChange temos
DBT_DEVICEARRIVAL que equivale a $8000 que indica que o sistema encontrou um novo dispositivo e
DBT_DEVICEREMOVECOMPLETE que é $8004 que indica que o dispositivo foi desconectado


Código: Selecionar todos
procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
  DBT_DEVICEARRIVAL = $8000; // Sistema detectou novo dispositivo conectado
  DBT_DEVICEREMOVECOMPLETE = $8004;  // Um dispositivo foi desconectado
var
  myMsg: string;
begin
  inherited;
  case Msg.wParam of
    DBT_DEVICEARRIVAL: minhaMsg  := 'Novo dispositivo encontrado';
    DBT_DEVICEREMOVECOMPLETE: minhaMsg := 'UmDispositivo Desconectado';
  end;
  ShowMessage(minhaMsg);
end;



Agora vem a parte divertida:


O codigo abaixo eu peguei na internet, era mais rapido que escrever na mao:

unit USB_D;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type

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

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

type
TForm1 = class(TForm)
Memo1: TMemo;

private
{ Declaracoes Privadas WMDeviceChange é uma mensagem do Windows
que avisa mudança de hardware}
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
public
{ Declaracoes Publicas }
end;

var
Form1: TForm1;
GetLettre : string;
implementation

{$R *.dfm}

// Como detectar Conexao/Desconexão de dispositivos USB de armazenamento de dados
// Exemplo de Rylou 27/01/2005 21:44


// Captura do Evento do Windows "WMDeviceChange"
procedure TForm1.WMDeviceChange(var Msg: TMessage);
var
VolName, FileSysName : Array[0..Max_Path]Of Char;
VolSerial, FileMaxLen, FileFlags : DWord;
S : string;
begin

// Verifica se DBT_DEVICEARRIVAL = $8000
// Se sim, foi detectado um novo dispositivo conectado.

if Msg.wParam =$8000 then begin
if PDEV_BROADCAST_HDR( Msg.LParam )^.dbch_devicetype <>2 then exit;
if PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_flags <>0 then exit;

// A partir d'ici vous pouvez mettre votre code a executer en cas
// de connection d'un peripherique de stockage USB.
// Vous pouvez aussi par exemple comparer le "Non de volume"
// de ce péripphérique pour affiner le declenchement.

//Affiche dans le textbox les infos du periphérique connécté (pour l'exemple)
S := 'Connection du périphérique !' +#13+#10+#13+#10;
// Sa lettre "DeviceID"
str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre);
S := S + 'DeviceID :'+#9+#9+ char(strtoint(GetLettre)) + ':\' + #13+#10;
// NomVolume + SySfichier + N° serie du periphérique
If GetVolumeInformation(pchar(char(strtoint(GetLettre))+':\'),VolName,Max_Path,@VolSerial,
FileMaxLen, FileFlags,FileSysName,Max_Path)
Then S := S +'Nom du Volume :' +#9+#9+ VolName
+#13+#10'Système de fichiers :' +#9+ FileSysName
+#13+#10'Numéro de série :' +#9+#9+ IntToStr(VolSerial)+#13+#10;
// Taille et free espace du periphérique
S := S + 'Taille totale :' +#9+#9+ FloatToStrF(DiskSize(strtoint(GetLettre)-64)div 1024, ffNumber, 18, 0) + ' Kilo-octets' + #13+#10;
S := S + 'Disponible :' +#9+#9+ FloatToStrF(DiskFree(strtoint(GetLettre)-64) div 1024, ffNumber, 18, 0) + ' Kilo-octets';
memo1.text:=S;
beep; // Envoi un beep sonore a la connection
end; // Fin de traitement "connection periphérique"



//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
// TESTER si DBT_DEVICEREMOVECOMPLETE = $8004
// si oui, ne traiter que les périphériques de stockage de type 0=DeviceTypeOEM
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
if Msg.wParam =$8004 then begin
if PDEV_BROADCAST_HDR( Msg.LParam )^.dbch_devicetype <>2 then exit;
if PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_flags <>0 then exit;

// A partir d'ici vous pouvez mettre votre code a executer en cas
// de déconnection d'un peripherique de stockage USB.
// Affiche dans le textbox le periphérique déconnécté (pour l'exemple)
S := 'Déconnection du périphérique !' +#13+#10+#13+#10;
// Sa lettre "DeviceID"
str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre);
S := S + 'DeviceID :' +#9+#9+ char(strtoint(GetLettre)) + ':\' + #13+#10;
memo1.text:=S;
beep; // Envoi un beep sonore a la déconnection
end; // Fin de traitement "déconnection periphérique"

end;

end.


eis a pasta de onde eu peguei este exemplo:
http://www.4shared.com/dir/573206/649e0 ... macao.html

espero que tenha utilidade
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP

Mensagempor reginaldo » 21 Mai 2009 17:55

Obrigado,

Wagner vou testar, Valeu!!!
reginaldo
Bit
 
Mensagens: 30
Registrado em: 16 Out 2006 12:30


Voltar para Delphi e Pascal

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x