2017-02-12 25 views
9

MSHTML.pas單元中的IDeveloperConsoleMessageReceiver單元在Delphi 2010中不存在,但(可能)存在於更新版本中,因爲它是最近的一個功能。如何在編譯時測試接口是否存在?

我想手動聲明這個接口,但只有在它不存在的情況下。

我該如何測試這個接口是否被聲明?

有點像 「假」 的代碼:

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

爲什麼不問它被引入的版本,然後測試版本號? –

+0

這個接口就是一個例子。 –

+2

MSHTML.pas是從系統類型庫(mshtml.tlb)生成的。有些工具可以從任何typelib生成pas文件。 –

回答

12

你在找什麼是

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

更多細節可以發現here

編輯:只是爲了澄清,它是檢驗符號在了$如果發生範圍聲明。因此,即使在當前項目中聲明瞭一個符號,但如果聲明的單元不在所測試單元的使用範圍內,它將不會被計算爲聲明。

+0

它的工作原理,謝謝。但代碼有一個小錯誤:{$ IFEND},而不是{$ ENDIF}。 –

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; 

這可能並不理想,這取決於問題的範圍。