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

Delphi 如果我在一个应用程序中多次使用一个类,它会被编译成exe吗?,delphi,compilation,Delphi,Compilation,我正在评估审判保护制度的许多可能性,并提出了以下问题: 如果我多次使用我的“试用检查”类(在应用程序中分散了好几次),它会被编译到exe中吗 我问这个问题的原因是,如果它只编译一次到exe中,那么修补这个类将使所有使用它的地方失效 如果只编译一次,是否有可行的替代方案来防止这种情况 谢谢 编辑:实际上,我并不是在尝试推出我自己的保护系统,我正在研究几种现有的解决方案,如OnGuard、mxProtector和TRegWare。在查看各种解决方案的源代码时,我提出了这个问题。是的,即使您在不同的位

我正在评估审判保护制度的许多可能性,并提出了以下问题:

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

我问这个问题的原因是,如果它只编译一次到exe中,那么修补这个类将使所有使用它的地方失效

如果只编译一次,是否有可行的替代方案来防止这种情况

谢谢


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

是的,即使您在不同的位置创建了该类的多个实例,也只有一个方法副本(实现),因此如果黑客修补该类,所有实例都将被修补

你真的想推出自己的保护系统吗?要想出一个好的系统并不容易,而且有几种现成的解决方案,如果你有预算的话,也许(现在是开源的)就可以了

顺便说一句,一般的看法是,如果他们想破解你的应用程序,不管怎样,他们都会这么做,所以不应该在保护计划上浪费太多资源。唯一简单的方法是从试用版中排除一些(关键)功能,即

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

但是,当然,如果完整版本进入流行状态,那么它将被破解…

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

但在安全设置中,这就没有什么意义了。因为如果某人已经学会了寻找一种模式,他可以简单地重复搜索以找到其他事件,使其成为一个小麻烦

这就是为什么DIY保护常常是浪费时间的原因之一,我完全同意Ain的观点。(onguard的事情,以及如果功能在exe中,它迟早会被解锁的事实,提供了足够的动力)

如果您在可能的情况下使用for函数和方法,可执行代码将是“多重的”。不过,内联的使用有一些限制(请参阅链接文档)


我同意Ain和Marco的观点,即在保护计划上花费精力可能麻烦多于好处,使用现有解决方案比推出自己的解决方案更有意义

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

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>;
类型
TDummy=类
公众的
程序Dummy1;
结束;
程序TDummy.Dummy1;
开始
...
结束;
变量
FDummy1:TDummy;
FDummy2:TDummy;
FDummy3:TDummy;
FDummy4:TDummy;

请注意,方法不存储在类中。从技术上讲,它们只是获得一个额外的、隐藏的自参数的过程或函数,而不是更多。Self指向被该方法操纵的类的实例。实际上,我并没有尝试推出我自己的保护系统,我正在研究几种现有的解决方案,如OnGuard、mxProtector和TRegWare。在查看各种解决方案源代码时,我提出了这个问题。在这种情况下,它们被直接编译到调用位置,并且存在汇编代码的多个副本。(哎呀,下面已经有人这么说了。)所有的答案都有它的优点,我想感谢每一位对此做出贡献的人。我将接受这个答案,因为这是一个有更多选票的答案。谢谢拉尔斯,内联听起来是一个可能的解决方案。内联的局限性列出+不过考虑一下,通常内联代码会调用其他地方进行检查,或者接近某个众所周知的地址。因此,在现实中,要搜索的模式最多也会变得稍微复杂一些。使用不同的方法对同一个支票进行编码,并将其内联,这将非常有趣。我最初的想法是将代码放在一个或多个include文件中。