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

EPr*_*und 4 delphi compiler-construction portable-executable delphi-xe3

当我遇到这个功能时,我正在阅读SysUtils:

function ALR: Pointer;
var
  LibModule: PLibModule;
begin
  if MainInstance <> 0 then
    Result := Pointer(LoadResource(MainInstance, FindResource(MainInstance, 'DVCLAL',
      RT_RCDATA)))
  else
  begin
Run Code Online (Sandbox Code Playgroud)

之后,我搜索了什么是DVCLAL,我发现了这个问题.

Delphi编译器发送给DVCLAL资源的所有可能签名是什么?

Jer*_*ers 5

没有这方面的官方文档,所以这是我 15 多年前的笔记中的一些内容:

DVCLAL有检查哪些SKU德尔福的你正在使用它每个SKU变化。

只检查 Professional ( RPR) 和 Client/Server ( RCS) SKU:

procedure RCS;

procedure RPR;
Run Code Online (Sandbox Code Playgroud)

如果他们失败了,他们会调用这个方法:

procedure ALV;
begin
  raise Exception.CreateRes(@SNL);
end;
Run Code Online (Sandbox Code Playgroud)

在哪里

resourcestring
  SNL = 'Application is not licensed to use this feature';
Run Code Online (Sandbox Code Playgroud)

根据功能矩阵和 Delphi 版本,各种组件在其构造函数中调用RPR和以保证最小 SKU。RCSCreate


Dan*_*all 5

我只是增加一个回答这个问题,所有谁搜索实际DVCLAL人(d elphi V isual Ç omponent 大号 ibrary 一个 CCESS 大号 icense)值,以及其他一些信息,谁是好奇,怎么东西所有的人作品.

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

应用程序未获得使用此功能的许可

2)如果你想检查一个特定的版本,你可以使用函数的输出GDAL(G et D elphi A ccess L icense),它是以下之一(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
Run Code Online (Sandbox Code Playgroud)

如果DVCLAL资源具有无效值,GDAL将调用ALV哪个将引发Exceptionwith消息SysConst.SNL.

3)如果要检查外部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
Run Code Online (Sandbox Code Playgroud)

4)只是为了好玩:如果你解决了公式,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并且AL2AL1sAL2s数组中描述所需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
Run Code Online (Sandbox Code Playgroud)

要验证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];
Run Code Online (Sandbox Code Playgroud)

并期待AL1和AL2数组中AL1sAL2s,

这样你可以伪装你曾经使用过的版本.

5)与此同时,至少已发布了官方文件,至少是GDAL,RPRRCS的功能.

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