【问题标题】:What are the list of all possible values for DVCLAL?DVCLAL 的所有可能值的列表是什么?
【发布时间】:2013-09-10 13:18:31
【问题描述】:
当我遇到这个功能时,我正在阅读 SysUtils:
function ALR: Pointer;
var
LibModule: PLibModule;
begin
if MainInstance <> 0 then
Result := Pointer(LoadResource(MainInstance, FindResource(MainInstance, 'DVCLAL',
RT_RCDATA)))
else
begin
之后,我搜索了 DVCLAL 是什么,发现了这个question。
Delphi 编译器向 DVCLAL 资源发出的所有可能的签名是什么?
【问题讨论】:
标签:
delphi
compiler-construction
delphi-xe3
portable-executable
【解决方案1】:
我只是为所有搜索实际 DVCLAL (Delphi Visual C omponent Library Access License) 值,以及一些其他信息,供所有好奇的人使用。
- 就像 Jeroen Wiert Pluimers 所说,如果您想在 Delphi 应用程序/库/包/组件中检查“专业或更高版本”或“仅限企业”,您可以使用
RPR (Require Professional)或RCS(“Require Client/Server”;客户/ Server 分别是早期 Delphi 版本中企业版的名称)。如果不满足要求,将调用ALV(Access License Violation),这将引发Exception SysConst.SNL 中定义的消息(S Not Licensed)。英文:
应用程序未获得使用此功能的许可
- 如果您想检查某个特定版本,可以使用函数
GDAL (Get Delphi A访问 License),它是以下之一(AL1s 数组):
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
如果 DVCLAL 资源的值无效,GDAL 将调用 ALV,这将引发带有消息 SysConst.SNL 的 Exception。
- 如果您想检查外部 EXE/DLL 文件的 DVCLAL 值(例如,如果您想编写资源编辑器、反编译器等),则必须直接查询 DVCLAL 资源。
官方值只有三个:
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
- 只是为了好玩:如果你求解公式
0 = (ROR(a,15) xor a) xor (ROR(b,10) xor b) xor (ROR(c,5) xor c) xor (AL1 xor AL2),你可以定义任何你想要的DVCLAL值(元组a、b、c、d)! (AL1 和 AL2 是 AL1s 和 AL2s 数组中的值,用于描述所需的 Delphi 版本;ROR 通过进位向右旋转)
例如,以下是替代的 DVCLAL 也可以:
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
要验证 DVCLAL,您需要计算
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];
并在数组AL1s和AL2s中查找AL1和AL2,
这样你可以伪装你使用的版本(至少一点点)。
- 同时,官方文档已经发布,至少针对函数GDAL、RPR 和RCS。
- 当然,一切都适用于 C++ Builder。
【解决方案2】:
没有关于这方面的官方文档,所以这是我 15 多年前的笔记中的一些内容:
DVCLAL 用于检查您使用的 Delphi 的哪个 SKU,每个 SKU 都不同。
只有专业 (RPR) 和客户端/服务器 (RCS) SKU 的检查:
procedure RCS;
procedure RPR;
如果他们失败了,他们会调用这个方法:
procedure ALV;
begin
raise Exception.CreateRes(@SNL);
end;
在哪里
resourcestring
SNL = 'Application is not licensed to use this feature';
根据特征矩阵和 Delphi 版本,各种组件在其 Create 构造函数中调用 RPR 和 RCS 以保证最小 SKU。