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 Component Library Access L icense )値を検索するすべての人ために、この質問に別の回答を追加します。動作します。

  1. Jeroen Wiert Pluimers が言ったように、Delphi アプリケーション/ライブラリ/パッケージ/コンポーネント内で「Professional 以上」または「Enterprise のみ」を確認したい場合は、(RPR R equire Pro ofessional ) またはRCS(" R equire Client/サーバー」。クライアント/サーバーは、初期の Delphi バージョンではエンタープライズ エディションの名前でした)。要件が満たされない場合は、( Access L icense Violation ) が呼び出さ、 ( S N ot Licensed )で定義されたメッセージが表示されます。英語で:ALVExceptionSysConst.SNL

アプリケーションは、この機能を使用するライセンスがありません

  1. 特定のエディションを確認したい場合は、関数の出力GDAL( G et D elphi Access 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

DVCLAL リソースに無効な値がある場合、with メッセージを発生させるGDALを呼び出します。ALVExceptionSysConst.SNL

  1. 外部の EXE/DLL ファイルの DVCLAL 値を確認する場合 (たとえば、リソース エディター、逆コンパイラなどを作成する場合)、DVCLAL リソースを直接クエリする必要があります。

公式の値は 3 つだけです。

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

たとえば、次の代替 DCLAL も機能します。

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

DCLAL を検証するには、次を計算します。

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配列内AL1sで およびAL2s

このようにして、使用したエディションを (少なくとも少しは) 偽装することができます。

  1. それまでの間、少なくとも関数GDALRPRRCSに関する公式ドキュメントが公開されています。
  1. もちろん、すべて C++ Builder でも機能します。
于 2017-07-11T00:54:47.700 に答える
6

これに関する公式文書はないので、15年以上前の私のメモから何かを引用します:

使用している DelphiのDVCLALSKU を確認するためにあり、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とを呼び出して、最小 SKU を保証します。RCSCreate

于 2013-09-10T18:23:30.750 に答える