
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.