如何在编译时测试接口是否存在?

时间:2017-02-12 23:04:34

标签: delphi

IDeveloperConsoleMessageReceiver单元中的MSHTML.pas接口在Delphi 2010中不存在,但(可能)存在于更新版本中,因为它是最近的功能。

我想手动声明此界面,但前提是它尚未存在。

如何测试是否声明了此接口?

像#"假的"代码:

{$IFNDEF "IDeveloperConsoleMessageReceiver"}
type
  IDeveloperConsoleMessageReceiver = interface ...
{$ENDIF}

2 个答案:

答案 0 :(得分:12)

您正在寻找的是

{$IF not DECLARED(IDeveloperConsoleMessageReceiver)}
  IDeveloperConsoleMessageReceiver = interface ...
{$ENDIF}

可以找到更多详细信息here

编辑:只是为了澄清,它将测试符号是否在$ IF发生的范围内声明。因此,即使在当前项目中声明了符号,如果声明它的单位不在您测试它的单位的用途中,它也不会被声明为已声明。

答案 1 :(得分:5)

您可以使用{$IF}编译器定义来测试predefined constants

{$IFDEF CONDITIONALEXPRESSIONS}
  {$IF MSHTMLMajorVersion < 4}  // Implement interface
    type
      IDeveloperConsoleMessageReceiver = interface ...
  {$IFEND}
{$ENDIF}

MSHTMLMajorVersionMSHTML.PAS中声明的常量,它定义是否声明特定接口:

const
  // TypeLibrary Major and minor versions
  MSHTMLMajorVersion = 4;
  MSHTMLMinorVersion = 0;

如果您的问题是如何测试编译时是否存在任何接口,那么除非您无法从常量派生它,否则可以强制编译器在未声明的情况下因错误而停止:

type
  IMyTest = IDeveloperConsoleMessageReceiver;   

这可能并不理想,具体取决于问题的范围。