6

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

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

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

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

4

2 回答 2

8

我只是为这个问题添加另一个答案,为所有搜索实际 DVCLAL(D elphi V isual C omponent L ibrary A ccess L icense的人,以及为所有好奇的人提供一些其他信息作品。

  1. 就像Jeroen Wiert Pluimers说的那样,如果你想在你的 Delphi 应用程序/库/包/组件检查“专业或更高版本”或“仅限企业”,你可以使用RPR(要求专业)或(“要求客户/服务器”;客户端/服务器分别是早期 Delphi 版本中企业版的名称)。如果不满足要求,将调用( A ccess L icense V iolation ),这将使用( S Not L icensed ) 中定义的消息引发 an 。用英语讲:RCSALVExceptionSysConst.SNL

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

  1. 如果您想检查一个特定版本,可以使用函数的输出GDAL( G et D elphi A ccess L icense),它是以下之一 ( AL1sarray):
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将引发Exceptionwith 消息SysConst.SNL

  1. 如果您想检查外部 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
  1. 只是为了好玩:如果你解决了公式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并且是描述所需Delphi版本的和数组AL2中的值;通过进位向右旋转)AL1sAL2sROR

例如,这里有一些替代的 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];

AL1AL2在数组中查找AL1sand AL2s,

这样你就可以伪装你使用的版本(至少一点点)。

  1. 与此同时,官方文档,至少对于函数GDALRPRRCS,已经发布。
  1. 当然,一切都适用于 C++ Builder。
于 2017-07-11T00:54:47.700 回答
6

没有关于此的官方文档,所以这是我 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 版本,各种组件调用RPRRCS在其Create构造函数中保证最小 SKU。

于 2013-09-10T18:23:30.750 回答