PDA

Ver la Versión Completa : Como capturar el serial del disco duro en delphi


hperez
16-05-2007, 23:59:38
Alguien me podria ayudar como capturar el serial del disco duro de mi pc con delphi 2006

seoane
17-05-2007, 00:36:43
¿Revisaste la sección de trucos?

hperez
17-05-2007, 01:29:46
Acabo de revisar algunos hilos y esta es la solucion mas practica


function GetVolumeID(DriveChar: Char): String;
var
MaxFileNameLength, VolFlags, SerNum: DWord;
begin
if GetVolumeInformation(PChar(DriveChar + ':\'), nil, 0,
@SerNum, MaxFileNameLength, VolFlags, nil, 0)
then
begin
Result := IntToHex(SerNum,20);
Insert('-', Result, 5);
// Result := IntToStr(SerNum);---si necesitan el decimal
end
else
Result := '';
end;
procedure TFrmLogin.Button1Click(Sender: TObject);
begin
ShowMessage(GetVolumeID('C'));
end;

MAXIUM
17-05-2007, 02:52:27
¿ese es el de fabrica o el que se crea con cada format?

cHackAll
17-05-2007, 03:06:25
Lastimosamente no recuerdo exactamente el otro, pero ése es el del Boot (generado al formatear)...

Neftali [Germán.Estévez]
17-05-2007, 12:45:48
Revisa la sección de componentes (http://neftali.clubdelphi.com/delphi_componentes.html) de mi página. Hay uno que te permite obtener el número de Serie del Disco Duro (no el número de volumen -que es el que se borra al formatear-); Tengo unas modificaciones pendientes referentes a cuando hay más de una partición, pero funciona bien en el resto de casos. Cuando tenga un poco de tiempo de revisaré...

cHackAll
21-05-2007, 20:50:40
Acá les dejo la función que hice el '05 para obtener la serie de un HDD... La adecué un poco para que sea una función independiente pues yo lo uso luego del "InitExe". Es todo lo que se necesita y funciona a la perfección sin DLLs.

function GetSerial(Drive: Char): ShortString;
const InBuffer: array [0..7] of Cardinal = ($200,$10100,$ECB000,0,0,0,0,0);
var
hDevice, Dummy: Cardinal;
IdeInfo: array [0..$83] of Cardinal;
begin
Result[0] := #0;
hDevice := CreateFile(PChar('\\.\' + Drive + ':'), GENERIC_READ + GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDevice <> INVALID_HANDLE_VALUE then
begin
DeviceIoControl(hDevice, $7C088, @InBuffer, SizeOf(InBuffer), @IdeInfo, SizeOf(IdeInfo), Dummy, nil);
CloseHandle(hDevice);
Result[0] := #20;
Move(IdeInfo[9], Result[1], Byte(Result[0]));
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Caption := '"'+GetSerial(ComboBox1.Text[1])+'"'; // 'a..z'
end;

La función no es aplicable en 9x, puesto que para ésos fines se debiese acceder a los puertos que manejan los buses (1F0h, 170h, 1E8h y 168h).
Personalmente mis aplicaciones solo corren en NT, lo decidí firmemente cuando me enteré que Microsoft ya no daba soporte a ésos SOs.

PD: Disculpen el retraso pero andaba "programando"