Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   como modificar este codigo (https://www.clubdelphi.com/foros/showthread.php?t=60852)

kurono 16-10-2008 01:41:39

como modificar este codigo
 
hola amigos del foro me gustaria modificar este codigo q le muestro pues se trata de un codigo que hiso nuestro amigo hackall en donde el muestra como identificar sectores dañado de un disco pues bien el codigo funciona de maravilla pero el incombeniente es que la unidad a comprobar estaria por defecto al ejecutarse y me gustaria poder elegir una unidad para comprobar pues ni mas ni menos le muestro el codigo


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
 
var
 hDevice, Dummy, Sectors, Sector: Cardinal;
 Buffer: array [0..$FFFF] of Byte;
 Geometry: record
  Cylinders: Int64;
  MediaType,
  TracksPerCylinder,
  SectorsPerTrack,
  BytesPerSector: Cardinal;
 end;
 
begin
 SetErrorMode(SEM_FAILCRITICALERRORS);
 hDevice := CreateFile('\\.\g:', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
 if hDevice <> INVALID_HANDLE_VALUE then
  begin
   DeviceIoControl(hDevice, $70000{IOCTL_DISK_GET_DRIVE_GEOMETRY}, nil, 0, @Geometry, SizeOf(Geometry), Dummy, nil);
   Sectors := Geometry.SectorsPerTrack * Geometry.TracksPerCylinder * Geometry.Cylinders;
   for Sector := 0 to Sectors - 1 do
    begin
     Label1.Caption := 'Leyendo el sector #' + IntToStr(Sector) + '...';
     Application.ProcessMessages; // Use a thread !!!
     if not ReadFile(hDevice, Buffer, Geometry.BytesPerSector, Dummy, nil) then
      ShowMessage('El sector #' + IntToStr(Sector) + ' esta dañado !');
    end;
   CloseHandle(hDevice);
  end;
end;
end.

coso 16-10-2008 09:09:48

Bueno, parece ser que lo unico que deberias hacer es cambiar la g: por la unidad en cuestion no? cambia la str a la que quieras y ya esta :confused:

kurono 16-10-2008 19:38:52

me disculpo si no me explique bien lo que quiero hacer es poder cambiar la unidad a comprobar en modo de ejecucion

egostar 16-10-2008 19:42:40

Cita:

Empezado por kurono (Mensaje 320585)
me disculpo si no me explique bien lo que quiero hacer es poder cambiar la unidad a comprobar en modo de ejecucion

Hola kurono

Pues es exactamente lo que te comento coso, debes de reemplazar la unidad con una variable, no es mal rollo pero en un poco mas de año que llevas inscrito en el club ya deberias de tener claro como incluir variables en una cadena.

Salud OS

kurono 17-10-2008 23:24:48

ok es verdad disculpa mi inorancia eso mismo hare luego les cuento

coso 17-10-2008 23:25:45

disculpas aceptadas

cmm07 18-10-2008 01:03:49

si quieres cambiarlo en tiempo de ejecucion podria ser así una funcion:

Código Delphi [-]
function verifica(Unidad: Char): PAnsiChar;
var
 hDevice, Dummy, Sectors, Sector: Cardinal;
 Buffer: array [0..$FFFF] of Byte;
 Geometry: record
  Cylinders: Int64;
  MediaType,
  TracksPerCylinder,
  SectorsPerTrack,
  BytesPerSector: Cardinal;
 end;

begin
 SetErrorMode(SEM_FAILCRITICALERRORS);
 hDevice := CreateFile(PChar('\\.\'+Unidad+':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
 if hDevice <> INVALID_HANDLE_VALUE then
  begin
   DeviceIoControl(hDevice, $70000{IOCTL_DISK_GET_DRIVE_GEOMETRY}, nil, 0, @Geometry, SizeOf(Geometry), Dummy, nil);
   Sectors := Geometry.SectorsPerTrack * Geometry.TracksPerCylinder * Geometry.Cylinders;
   for Sector := 0 to Sectors - 1 do
    begin
     Form1.Label1.Caption := 'Leyendo el sector #' + IntToStr(Sector) + '...';
     Application.ProcessMessages; // Use a thread !!!
     if not ReadFile(hDevice, Buffer, Geometry.BytesPerSector, Dummy, nil) then
      ShowMessage('El sector #' + IntToStr(Sector) + ' esta dañado !');
    end;
   CloseHandle(hDevice);
  end;
end;

Para usarlo:

Código Delphi [-]
Verifica('C');

bueno espero poder ayudar, este codigo esta creado sin comprobarse...



54LU2

kurono 18-10-2008 03:43:13

Gracia amigo cmm07 por tu ayuda pues el codigo ya me funciona aunque me daba error al principio pero ya lo resolvi pues en la linea de la funcion en ves de declararlo como char yPAnsiChar lo declare como string y con eso ya me funciona perfectamente gracia

User_Baja_2 19-10-2008 11:31:53

componente
 
Otra idea,

Si quieres, para que quede un poco mejor, en tiempo de ejecucción en el formulario puedes poner el componente: TDriveComboBox y cargar la variable del código que hay en el post anterior con la unidad que quede marcada aqui y el aspecto quedará mejor :-)

Un saludo

Nuppy

kurono 19-10-2008 18:08:59

ok gracias


La franja horaria es GMT +2. Ahora son las 18:08:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi