如果我在一个应用程序中多次使用一个类,它只会被编译一次到exe中吗?

时间:2011-08-18 09:56:13

标签: delphi compilation

我正在评估试验保护系统的许多可能性,并提出了以下问题:

如果我多次使用我的“试验检查”类(在应用程序上分散了几次),它只会被编译一次到exe中吗?

我之所以要问的是,如果它只编译一次到exe中,那么修补这个单独的类将使使用它的所有地方无效。

如果它只编译一次,是否有任何可行的替代方法来阻止这种情况?

谢谢!

编辑:我实际上并没有尝试推出自己的保护系统,我正在研究一些现有的解决方案,如OnGuard,mxProtector和TRegWare。在查看各种解决方案的源代码时,我提出了这个问题。

4 个答案:

答案 0 :(得分:13)

是的,即使你在不同的地方创建了几个类的实例,也只有一个方法的副本(实现),所以如果黑客修补了这个类,那么所有实例都将被修补。

你真的想要推出自己的保护系统吗?想出好的系统是不容易的,并且有几个随时可以使用的解决方案,如果你在预算上,那么也许TurboPower OnGuard(现在是开源的)就可以了。

顺便说一下,一般的智慧是,如果他们想要破解你的应用程序,无论如何都会这样做,所以不应该在保护方案上浪费太多资源。唯一万无一失的方法是从试用版中排除一些(关键)功能,即

{$IFDEF trial_version}
  ShowMessage('Sorry, this function is not available in trial version');
{$ELSE}
  // do the thing
{$END}

但当然,如果完整版本变得疯狂,那么它将被破解......

答案 1 :(得分:4)

如果您在可能的情况下使用inline keyword函数和方法,则可执行代码将是“多重复制的”。但是,使用内联有一些限制(参见链接文档)。

我同意Ain和Marco的观点,在保护计划上花费精力可能比利益更加麻烦,使用现有解决方案比使用自己的解决方案更有意义。

答案 2 :(得分:3)

是。标准的解决方法是将代码放在.inc中,并将其包含在多个单元中。

但是在安全设置中这没什么意义。因为如果某人学会了搜索模式,他可以简单地重复搜索以找到其他事件,最多只是一个小麻烦。

这就是为什么DIY保护往往是浪费时间的原因之一,我完全赞同艾因。 (无论是onguard还是事实,如果功能在exe中,它迟早会解锁,给予足够的动力)

答案 3 :(得分:3)

仅为原则:实际上有可能多次编译“相同”类。如果您使用泛型类型声明该类,并且稍后具有多个具有不同实例类型的实例,则会为每种类型编译类代码。泛型类甚至不必使用泛型类型。如果将通用实例分布在不同的单元上,代码也将被分开。

type
  TDummy<T> = class
  public
    procedure Dummy1;
  end;

procedure TDummy<T>.Dummy1;
begin
  ...
end;

var
  FDummy1: TDummy<Integer>;
  FDummy2: TDummy<Byte>;
  FDummy3: TDummy<TButton>;
  FDummy4: TDummy<TLabel>;