2017-02-12 7 views
9

Интерфейс IDeveloperConsoleMessageReceiver в блоке MSHTML.pas не существует в Delphi 2010, но (возможно) существует в более поздних версиях, поскольку это недавняя функция.Как проверить, существует ли интерфейс во время компиляции?

Я хочу вручную объявить этот интерфейс, но только если он еще не существует.

Как проверить, объявлен ли этот интерфейс?

Что-то вроде "фальшивого" кода:

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

Почему бы не спросить, какая версия была введена, а затем проверить номер версии? –

+0

Этот интерфейс является примером. –

+2

MSHTML.pas создается из библиотеки системного типа (mshtml.tlb). Существуют инструменты для создания файла pas из любого typelib. –

ответ

12

Что вы ищете

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

Более подробную информацию можно найти here

EDIT: Просто чтобы прояснить, это будет проверить, если символ объявлен в области, где происходит $ IF. Таким образом, даже если символ объявлен в вашем текущем проекте, если единица, где она объявлена, не находится в ИСПОЛЬЗОВАНИИ единицы, в которой вы ее проверяете, она не будет считаться объявленной.

+0

Он работает, спасибо. Но код имеет небольшую ошибку: {$ IFEND}, а не {$ ENDIF}. –

5

Вы можете проверить predefined constants с {$IF} компилятором определяет:

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

MSHTMLMajorVersion является объявленной константой в MSHTML.PAS, который определяет, будет ли конкретным интерфейс объявлен или нет:

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

Если ваш вопрос заключается в том, чтобы проверить, если какой-либо интерфейс существует во время компиляции, то, если вы не могли вывести ее из константы, вы можете заставить компилятор остановить с ошибкой, если она необъявленная:

type 
    IMyTest = IDeveloperConsoleMessageReceiver; 

Возможно, это не идеально, в зависимости от сферы действия вопроса.