Vcl.Printers.pas(888):W1025不支持的语言功能:'自定义属性'

时间:2014-09-09 14:01:59

标签: delphi delphi-xe6

我正在尝试修复another VCL bug;这次是Vcl.Printers.pas

现在我们通过将错误的VCL源文件复制到Delphi库路径中的另一个文件夹,并将修复程序应用于这些文件来实现此目的。我们已将修复程序应用于TPrinter.SetPrinter

但是文件中有六个方法用属性修饰:

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.Abort;
begin
   ...

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.EndDoc;
begin
   ...

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.NewPage;
begin
   ...

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
{$IF DEFINED(CLR)}
procedure TPrinter.SetPrinter(ADevice, ADriver, APort: string; ADeviceMode: IntPtr);
{$ELSE}
procedure TPrinter.SetPrinter(ADevice, ADriver, APort: PChar; ADeviceMode: THandle);
{$ENDIF}
var
   ...

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
function SetPrinter(NewPrinter: TPrinter): TPrinter;
begin
   ...

这些方法中的每一种都会引发警告:

  • [dcc32警告] Vcl.Printers.pas(968):W1025不支持的语言功能:'自定义属性'
  • [dcc32警告] Vcl.Printers.pas(978):W1025不支持的语言功能:'自定义属性'
  • [dcc32警告] Vcl.Printers.pas(1015):W1025不支持的语言功能:'自定义属性'
  • [dcc32警告] Vcl.Printers.pas(1026):W1025不支持的语言功能:'自定义属性'
  • [dcc32警告] Vcl.Printers.pas(1080):W1025不支持的语言功能:'自定义属性'
  • [dcc32警告] Vcl.Printers.pas(1599):W1025不支持的语言功能:'自定义属性'

我可以删除属性。或者可能有一种方法可以抑制警告。但我认为Embarcadero增加的属性有一些目的。

  • 使语言支持功能自定义属性的方法是什么?
  • 为什么它不是VCL来源中的警告?
  • 为什么VCL源允许在我不使用时使用它?
  • 这些属性在做什么?
  • 谁阅读这些论文?
  • 删除它们有问题吗?
  • 如果删除它们没有问题,它们为什么会出现?

我真的在问:

  

我如何让它发挥作用?

但我也很想知道:

  

为什么不起作用?

为什么使它成为一个更有用的问题,但修复它会很好。

Bonus Chatter

Yes,我们最终计划考虑调查使用detours的可能性。虽然推测方法应该仍然具有属性(否则为什么属性存在?)

1 个答案:

答案 0 :(得分:19)

错误消息有点误导。我会尽力为你翻译。当编译器说:

  

不支持的语言功能:'自定义属性'

它的真正含义是:

  

找不到与TCustomAttribute派生的,与您指定的属性名称匹配的类。


由.net框架定义的这些PrintingPermission属性对Delphi .net编译器具有意义。 Embarcadero仍然使用它来构建IDE的一部分。因此,保留条件代码,该代码打开CLR定义的存在。当这个VCL单元由Delphi .net编译器编译时,编译器可以看到.net框架类System.Drawing.Printing.PrintingPermissionAttribute

你试图处理VCL单位的警告几乎没有什么好处。这不是您的代码,修改VCL单元的目标是尽快进出。您应该致力于尽可能做出最小的改变。

所以,忽略警告。抑制您修改的VCL单元的警告和提示。在您编译的任何VCL单元的顶部填充{$W-},然后继续。或者如果你不能让自己变得如此严苛,你可以使用{$WARN UNSUPPORTED_CONSTRUCT OFF}


轮流提问:

  

使语言支持功能自定义属性的方法是什么?

这不是语言限制。只是这些属性仅在定位.net。

时定义
  

为什么它不是VCL来源中的警告?

至少在为.net。

以外的目标进行编译时
  

为什么VCL源允许在我不使用时使用它?

如果使用.net编译器,也可以使用它们。

  

这些属性在做什么?

System.Drawing.Printing.PrintingPermissionAttribute

  

谁阅读这些论文?

.net框架。我想。

  

删除它们有问题吗?

它不会影响Windows编译器产生的输出。它会增加修订控制系统中的差异量。

  

如果删除它们没有问题,它们为什么会存在?

因为它们用于.net。