Jeszcze raz o GetVolumeInformation

0

Na http://4programmers.net/Delphi/Artykuły/Zabezpieczenie_prgramu_przed_kopiowaniem jest funkcja ID. Próbowałem ją stosować, i mam kłopoty. Pomóżcie mi to zrozumieć.

Powiedzmy, że źródło wygląda tak:

           <span style="color: green">procedure TForm1.FormCreate(Sender: TObject);
           begin Label2.Caption:=concat('Numer = ',ID);
                   ShowMessage(ID);
                   Label1.Caption:=ID;
                   Label3.Caption:=ID;
                   ShowMessage(ID);
           end;</span>

Projekt mam na D:, tam kompiluję, wykonuję, wszystko działa dobrze. Mam na myśli to, że każde wywołanie funkcji ID zwraca ten sam numer.
Następnie plik exe kopiuję do jakiegoś folderu na D: i nadal wszystko działa dobrze.

Wreszcie kopiuję plik exe do jakiegoś folderu na C:
I wszystko się sypie. Funkcja ID wywołana parokrotnie zwraca różne numery, najczęściej JEDEN w pierwszej instrukcji, DRUGI w drugiej i 00000000 w kolejnych.

Ten JEDEN jest za każdym uruchomieniem exe z C: taki sam, ale po pierwsze jest inny, niż gdy program wykonuję z D:, a po drugie jeśli coś zmienię w programie, np. zmienię kolejność instrukcji albo po jednym Label3.Caption:=ID; dodam jeszcze dwa razy Label3.Caption:=ID;, to już otrzymam inny numer. Na C:, po skopiowaniu tam exe, bo na D: jest cały czas wszystko dobrze.

Proszę, napiszcie, dlaczego tak się dzieje, i pomóżcie jakoś temu zaradzić.

1

Spróbuj nie C: tylko C:\ u mnie działa :)

function ID: string;
var
   VolumeSerialNumber : DWORD;
   MaximumComponentLength : DWORD;
   FileSystemFlags : DWORD;
begin
   GetVolumeInformation( 'C:\', nil, 0, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, nil, 0 );

   Result :=  IntToHex( HiWord( VolumeSerialNumber ), 4 ) +  IntToHex( LoWord( VolumeSerialNumber ), 4 );
end;
0

kAzek, teraz rzeczywiście działa! nawet nie masz pojęcia, jak bardzo jestem Ci wdzięczny!

1 użytkowników online, w tym zalogowanych: 0, gości: 1