Delphi FAQ

Jak odczytać numer seryjny dysku

Adam Boduch

Funkcja ta podaje tylko numer seryjny partycji lub dyskietki, a nie dysku.

var
  Bufor : array[0..255] of Char;
  MaxCompLength, FileSystemFlags : Cardinal;
  Drive : Char;
  Serial : DWORD;
begin
  Drive := 'A';
  GetVolumeInformation(PChar(Drive + ':'),Bufor, SizeOf(Bufor), @Serial, MaxCompLength, FileSystemFlags, nil, 0);
end;
FAQ

4 komentarzy

W tej formie to nie działa!
Ale koncepcja dobra.
U mnie w D6 chodzi coś takiego:

var
Etykieta:array[0..MAX_PATH] of Char;
SystPlik:array[0..MAX_PATH] of Char;
MaxCompLength, FileSystemFlags : dword;
Drive:Char;
Serial:DWORD;
begin
Drive:='c';
GetVolumeInformation(PChar(Drive + ':'),Etykieta,SizeOf(Etykieta),
@Serial,MaxCompLength,FileSystemFlags,SystPlik,SizeOf(SystPlik));
end;

I wyjaśniam:
zmienne:
Etykieta - zawiera etykietę dysku/dysku logicznego (a nie partycji jak gdzieś przeczytałem) - gdy brak dyskietki/płyty w napędzie = krzaczki
SysPlik - zawiera nazwę systemu plików dysku (FAT32, CDFS itp) - gdy brak dyskietki/płyty w napędzie = pusty
Serial - zawiera numer seryjny - gdy brak dyskietki/płyty w napędzie = 0

Kilka ciekawych informacji niesie ze sobą FileSystemFlags - m.in. czy dysk jest skompresowany, czy nazwy plików rozróżniają duże/małe znaki itp. Niestety nie udało mi się tego sensownie ugryźć.

A powyższa wskazówka nie działa zapewne dlatego, że MaxCompLength i FileSystemFlags nie mogą być typu Integer (komunikat błędu - typ formalny i aktualny muszą być zgodne :))
;)

var
VolumeSerialNumber : DWORD;
MaximumComponentLength : DWORD;
FileSystemFlags : DWORD;
SerialNumber : string;
Drive : PChar;
begin
Drive := Pchar('c:\');
GetVolumeInformation(
Drive,
nil,
0,
@VolumeSerialNumber,
MaximumComponentLength,
FileSystemFlags,
nil,
0) ;
SerialNumber :=
IntToHex(HiWord(VolumeSerialNumber), 4) +
' - ' +
IntToHex(LoWord(VolumeSerialNumber), 4) ;

100% działa, służę pomocą!

to nie dzała!!!