Сущность технологии СОМ. Библиотека программиста :: Бокс Дональд
Страница:
494 из 528
Длярешения данной проблемы системный 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.
Асинхронные методы
Вызовы методов в СОМ являются по умолчанию синхронными. Это означает, что клиентский поток заблокирован до тех пор, пока ответное ORPC-сообщение не получено и не демаршалировано. Такая схема в полной мере демонстрирует, как работает обычный вызов метода в одном потоке ( same-thread ), и это с полным основанием принято по умолчанию. До появления Windows NT 5.0 не было способа осуществить вызов метода и продолжать обработку одновременно с выполнением метода без явного порождения дополнительных потоков. В версии СОМ Windows NT 5.0 вводится поддержка асинхронного вызова метода.
|< Пред. 492 493 494 495 496 След. >|