DVCLAL的所有可能值列表是什么?

时间:2013-09-10 13:18:32

标签: delphi compiler-construction delphi-xe3 portable-executable

当我遇到这个功能时,我正在阅读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资源的所有可能签名是什么?

2 个答案:

答案 0 :(得分:5)

我正在为这个问题添加另一个答案,对于搜索实际DVCLAL的所有人( D elphi V isual C omponent L ibrary A ccess L icense)值,以及所有对好事如何运作的所有人的其他信息。

1)像Jeroen Wiert Pluimers所说,如果你想在Delphi应用程序/库/包/组件中检查“专业或更高”或“仅限企业”,你可以使用RPR R 获得 Pr ofessional)或RCS(“ R equire C lient / S erver“; Client / Server分别是早期Delphi版本中企业版的名称。如果未满足要求,将调用ALV A ccess L icense V iolation),这将引发{{{ 1}}使用Exception中定义的消息( S N ot L icensed)。用英语:

  

申请未获许可使用此功能

2)如果你想检查一个特定的版本,你可以使用函数SysConst.SNL的输出( G et D elphi ccess L icense),它是以下之一(GDAL数组):

AL1s

如果DVCLAL资源的值无效,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 将调用GDAL,这将ALV引发消息Exception

3)如果你想检查外来EXE / DLL文件的DVCLAL值(例如,如果你想编写资源编辑器,反编译器等),那么你将不得不直接查询DVCLAL资源。

只有三个官方价值观:

SysConst.SNL

4)只是为了好玩:如果你解决公式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 ,你可以定义你想要的任何DVCLAL值(元组a,b,c,d)! (0 = (ROR(a,15) xor a) xor (ROR(b,10) xor b) xor (ROR(c,5) xor c) xor (AL1 xor AL2)AL1AL2AL1s数组中描述所需Delphi版本的值; AL2s通过进位直接旋转

例如,以下是可以使用的替代DVCLAL:

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

并在数组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中查找AL1和AL2,

通过这种方式,您可以伪装一下您使用过的版本。

5)与此同时,官方文件,至少对于GDALRPRRCS的功能已经发布。

6)当然,一切都适用于C ++ Builder。

答案 1 :(得分:4)

没有关于此的官方文档,所以这里有一些来自我15年前的笔记:

DVCLAL可以检查您正在使用的德尔福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版本,各种组件在RPR构造函数中调用RCSCreate以保证最小SKU。