HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Másolásvédelemmel ellátott program készítése


Példaprogram letöltése

5717 bájt

Mai cikkünkben egy olyan módszert mutatunk be, melynek segítségével könnyűszerrel másolásvédetté tehetjük programunkat. Az alapötletet az szolgáltatja, hogy minden tároló egységnek, legyen az floppy, merevlemez vagy CD, van egy egyedi sorozatszáma, valamint egy kötetcímkéje. Készítünk hát egy olyan komponenst, melybe mindezt „beleégethetjük”, így a programunk csak az általunk engedélyezett merev- vagy CD lemezről lesz futtatható.

A mellékelt példaprogram megnyitása előtt a CopyProtector.pas-ban levő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens tartalmaz két published property-t, melyekbe be kell írnunk annak a lemeznek a sorozatszámát és kötetcímkéjét, melyről a programunkat futtatni szeretnénk. Létrehozunk a komponensben egy Execute függvényt, melyet abból a programból kell meghívni, melyet védeni szeretnénk a másolás ellen. A sorozatszám, illetve a kötetcímke meghatározására a GetVolumeInformation függvényt fogjuk felhasználni. Ennek felépítése a következő:
GetVolumeInformation
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize );
Paraméterek
LPCTSTR lpRootPathName
A lemez gyökérkönyvtárára mutat.
LPTSTR lpVolumeNameBuffer
A lemezkötet címkéjének a nevére mutat.
DWORD nVolumeNameSize
A lemezcímke hossza.
LPDWORD lpVolumeSerialNumber
A lemez sorozatszáma.
LPDWORD lpMaximumComponentLength
A rendszer által támogatott fájlnév maximális hossza.
LPDWORD lpFileSystemFlags
Dupla szóra mutat, mely az adott rendszerre jellemző flag-eket tartalmazza.
Ez a paraméter a következők kombinációja lehet:
Paraméter Leírás
FS_CASE_IS_PRESERVED Amennyiben ez a flag be van állítva, a fájlrendszer érzéketlen a kis- és nagybetűkre a fájlnevekben.
FS_CASE_SENSITIVE Amennyiben ez a flag be van állítva, a rendszer támogatja a kis- és nagybetűk használatát a fájlnevekben.
FS_UNICODE_STORED_ON_DISK Amennyiben a flag értéket kap, a rendszer támogatja a Unicode-ot a fájlnevekben.
FS_PERSISTENT_ACLS Ennél a flagnél a fájlrendszer letilthatja, illetve engedélyezheti az ACL-t (Access Control List), azaz az objektum-hozzáférési jogosultságot. Például az NTFS letilthatja, illetve engedélyezheti, míg a FAT nem.
FS_FILE_COMPRESSION A fájlrendszer támogatja a fájl-alapú tömörítést.
FS_VOL_IS_COMPRESSED Amennyiben ez a flag be van állítva, a kijelölt lemezkötet tömörítve van, például egy DoubleSpace kötet.
LPTSTR lpFileSystemNameBuffer
A fájlrendszer nevére utal (például FAT vagy NTFS).
DWORD nFileSystemNameSize
A fájlrendszer nevének a hosszát adja vissza karakterben.
)
Visszatérési érték
Amennyiben az összes kért információ begyűjthető, egy nem nulla értéket ad vissza eredményként. Ellenkező esetben nullát kapunk.
Esetünkben az lpVolumeNameBuffer és az lpVolumeSerialNumber paraméterben tárolt értékekre lesz szükség.
Nézzük, hogyan is épül fel a függvényünk.
function TCopyProtector.Execute: Boolean;
var
  lpRootPathName,
  lpVolumeNameBuffer,
  lpFileSystemNameBuffer: array[0..63] of char;
  lpMaximumComponentLength, lpVolumeNumber,
  lpFileSystemFlags: DWORD;
  TmpStr, CurrentDrive: string;
Begin
Először a GetCurrentDir eljárással lekérdezzük az aktuális könyvtár elérési útvonalát. Ez az útvonal arra a könyvtárra fog mutatni, melyből a programunkat elindítottuk. Ebből az információból számunkra csak az aktuális meghajtó betűjele fontos, mely az első 3 karakterben van tárolva. A Copy paranccsal mindezt átmásoljuk a CurrentDrive nevű változóba.
  TmpStr:=GetCurrentDir;
  CurrentDrive:=Copy(TmpStr,1,3);
A következőkben az lpRootPathName paraméternek átadjuk a CurrentDrive-ban tárolt meghajtó betűjelét, így a GetVolumeInformation függvény ennek a meghajtónak a paramétereit fogja visszaadni.
  StrPCopy(lpRootPathName, CurrentDrive);
  GetVolumeInformation(
    lpRootPathName,
    lpVolumeNameBuffer,
    64,
    @lpVolumeNumber,
    lpMaximumComponentLength,
    lpFileSystemFlags,
    lpFileSystemNameBuffer,
    64
  );
Megvizsgáljuk, hogy a komponensben beállított értékek megegyeznek-e a fenti függvény által visszaadott értékekkel. Amennyiben nem, az Execute függvény visszatérési értéke hamis lesz, ellenkező esetben igaz.
  if (FSysLabel<>StrPas(lpVolumeNameBuffer)) or
    (FSerialNumber<>IntToHex(lpVolumeNumber, 8)) then
    begin
      Result:=False;
      ShowMessage('A megnyitás sikertelen volt!');
    end
  else Result:=True;
end;
A mellékelt példaprogramban létrehoztunk két Form-ot. Az elsőn, a komponens könnyebb tesztelése érdekében kiírattuk az aktuális meghajtó betűjelét, sorozatszámát és kötetcímkéjét. E két utóbbi értéket kell beírnunk a komponensbe ahhoz, hogy a Form2 megjelenjen. Amennyiben helytelen a megadott adat, a Form2 nem nyílik meg, helyette hibaüzenetet kapunk.
Form1-ben meghívtuk az Execute függvényt, és elvégeztük annak vizsgálatát.
if CopyProtector1.Execute=True then Form2.Show;
Ha a visszatérési érték igaz, akkor megjelenik a Form2, ellenkező esetben a komponens által szolgáltatott hibaüzenetet kapjuk.
A cikkben ismertetett másolásvédelem jól jöhet mindazoknak, akik programjaikat CD lemezen adják tovább, de nem szeretnék, hogy arról másolatot készítsenek. Hasonlóképp felhasználható olyan esetekben is, mikor egy hálózat csak egy adott gépének bizonyos partíciójáról szeretnénk, hogy programunkat futtassák.

Cikksorozat



Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 540. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |