Сущность технологии COM



         

Совмещение имен в IDL - часть 5


// surfboard.idl cpp_quote("static void Exit(void) { ExitProcess(1); }")

Имея данный IDL-код, сгенерированный C/C++ заголовочный файл будет просто содержать следующий фрагмент:

// surfboard.h static void Exit(void) { ExitProcess(1); }

Ключевое слово cpp_quote может быть использовано для осуществления различных трюков в компиляторе IDL. Примером этого может служить тип данных REFIID. Фактическим определением IDL для этого типа является

typedef IID *REFIID;

В то же время тип C++ определен как

typedef const IID& REFIID;

Однако ссылки в стиле C++ не допускаются в IDL. Для решения данной проблемы системный IDL-файл использует следующий прием:

// from wtypes.idl (approx.) // из файла wtypes.idl (приблизительно)

cpp_quote("#if 0") typedef IID "REFIID;

// this is the pure IDL definition // это чисто IDL-определение

cpp_quote("#endif") cpp_quote("#ifdef _cplusplus") cpp_quote("#define REFIID const IID&")

// C++ definition // определение C++

cpp_quote("#else") cpp_quote("#define REFIID const IID * const")

// С definition // определение С

cpp_quote("#endif")

Результирующий заголовочный файл C++ выглядит так:

// from wtypes.h (approx.) // из файла wtypes.h (приблизительно)

#if 0 typedef IID *REFIID; #endif #ifdef _cplusplus #define REFIID const IID& #else #define REFIID const IID * const #endif

Этот несколько гротескный прием необходим, поскольку многие базовые интерфейсы СОМ были определены без учета возможного применения IDL.

1

Можно утверждать, что исходное определение интерфейса было разумным, и что IDL просто недостаточно гибок для описания общих идиом программирования. Хотя это и может быть достаточным оправданием для интерфейса, определенного в 1992 году, до создания СОМ IDL, но это не может служить оправданием для современных интерфейсов. Просто примем, что всем интерфейсам следует подчиняться правилам СОМ IDL, если только не имеется достаточно обоснованной причины поступать иначе.




Содержание  Назад  Вперед