From a while ago, from notes even longer ago – around 1994 on DVCLAL
the Delphi VCL Access License code which is actually a checking logic for determining the SKU (stock keeping unit) or Delphi license: [WayBack] delphi – What are the list of all possible values for DVCLAL? – Stack Overflow
There is no official documentation on this, so here is something from my notes of 15+ years ago:
The
DVCLAL
is there to check which SKU of Delphi you are using and it varies per SKU.There are only checks for the Professional (
RPR
) and Client/Server (RCS
) SKUs:procedure RCS; procedure RPR;
If they fail, they call this method:
procedure ALV; begin raise Exception.CreateRes(@SNL); end;
where
resourcestring SNL = 'Application is not licensed to use this feature';
Depending on the feature matrix and Delphi version, various components call
RPR
andRCS
in theirCreate
constructors to guarantee a minimum SKU.
Underneath, these RPR
and RCS
functions call the function GDAL
. Their names are historic and got documented around Delphi 2007:
- [WayBack]
GDAL
(Get Delphi Access License) - [WayBack]
RPR
will Restrict to PRofessional license and higher - [WayBack]
RCS
will Restrict to Client/Service license and higher
Historically you had these levels of Delphi editions that could be distinguished this way:
- Personal
- Professional
- Client/Server (or Enterprise)
This excludes Starter and Community (which are “just” Personal), Turbo (which was “just” Professional), Architect and Ultimate, which are “just” Client/Server with extra tools.
A few years ago, another answer got added to that question explaining more details:
I am just adding another answer to this question, for all the people who search the for actual DVCLAL (Delphi Visual Component Library Access License) values, as well as some other information for all people who are curious how stuff works.
1) Like Jeroen Wiert Pluimers said, if you want to check for “Professional or higher” or “Enterprise only” inside your Delphi application/library/package/component, you can use
RPR
(Require Professional) orRCS
(“Require Client/Server”; Client/Server was the name for the Enterprise edition in early Delphi versions) respectively. If the requirement is not met,ALV
(Access License Violation) will be called which will raise anException
with the message defined inSysConst.SNL
(S Not Licensed). In English:Application is not licensed to use this feature
2) In case you want to check for one specific edition, you can use the output of the function
GDAL
(Get Delphi Access License), which is one of the following (AL1s
array):AL1s[0] = $FFFFFFF0; // Standard/Personal edition DVCLAL value AL1s[1] = $FFFFEBF0; // Professional edition DVCLAL value AL1s[2] = $00000000; // Enterprise/ClientServer edition DVCLAL value AL1s[3] = $FFFFFFFF; // DVCLAL resource not existing
if the DVCLAL resource has an invalid value,
GDAL
will callALV
which will raise anException
with messageSysConst.SNL
.3) In case you want to check the DVCLAL value of a foreign EXE/DLL file (e.g. if you want to write a Resource Editor, decompiler etc), then you’ll have to query the DVCLAL resource directly.
There are only three official values:
Standard: 23 78 5D 23 B6 A5 F3 19 43 F3 40 02 26 D1 11 C7 Professional: A2 8C DF 98 7B 3C 3A 79 26 71 3F 09 0F 2A 25 17 Enterprise: 26 3D 4F 38 C2 82 37 B8 F3 24 42 03 17 9B 3A 83
4) Just for fun: If you solve the formula
0 = (ROR(a,15) xor a) xor (ROR(b,10) xor b) xor (ROR(c,5) xor c) xor (AL1 xor AL2)
you can define any DVCLAL value (tuple a, b, c, d) you want! (AL1
andAL2
are the values in theAL1s
andAL2s
arrays which describe the desired Delphi edition;ROR
is rotate right through carry)For example, here are alternative DVCLALs which work too:
Standard: 00 00 00 00 00 00 00 00 9B 70 0C 66 6B 8F F3 99 Professional: 00 00 00 00 00 00 00 00 9A DB 73 0F 6A 30 8C F0 Enterprise: 00 00 00 00 00 00 00 00 D8 B2 48 11 D8 B2 48 11
To validate a DVCLAL, you calculate
AL1 := DVCLAL[0] xor DVCLAL[1] xor DVCLAL[2] xor DVCLAL[3]; AL2 := ROR(DVCLAL[0],15) xor ROR(DVCLAL[1],10) xor ROR(DVCLAL[2],5) xor DVCLAL[3];
and look up AL1 and AL2 in the array
AL1s
andAL2s
,This way you can disguise the edition you have used a little.
5) In the meantime, an official documentation, at least for the functions GDAL, RPR and RCS, has been published.
6) Of course, everything works for C++ Builder, too.
In the mean time, new posts explaining bits of DVCLAL
related resources (like PACKAGEINFO
and CHARTABLE
) and the TPF0
form/datamodule resource have appeared, of which this is a selection:
- [WayBack] Glooscap Software: Software made with Delphi. How do you know?
- [WayBack] Format of PACKAGEINFO resource – delphi
- [WayBack] Embarcadero Discussion Forums: Skype for Windows still Delphi? …
- [WayBack] Determine Delphi Application | Delphi Programming | FANDOM powered by Wikia
- [WayBack] Every Delphi DB program contains hidden code for EMB license checking – Synopse
- [WayBack] Package laden, PE resources (DVCLAL)
- [WayBack] Delphi signature in exe files – Stack Overflow
—jeroen