Все интерфейсы СОМ должны быть определены в IDL. IDL позволяет описывать довольно сложные типы данных в стиле, не зависящем от языка и платформы. Рисунок 2.6 показывает базовые типы, которые поддерживаются IDL, и их отображения в языки С, Java и Visual Basic. Целые и вещественные типы не требуют объяснений. Первые "интересные" типы данных, встречающиеся при программировании в СОМ, — это символы и строки.
Основные типы | boolean | unsigned char | unsupported | char |
byte | unsigned char | unsupported | char | |
small | char | unsupported | char | |
short | short | Integer | short | |
long | long | Long | int | |
hyper | _int64 | unsupported | long | |
float | float | Single | float | |
double | double | Double | double | |
char | unsigned char | unsupported | char | |
wchar_t | wchar_t | Integer | short | |
enum | enum | Enum | int | |
Interface Pointer | Interface Pointer | Interface Ref. | Interface Ref. | |
Расширенные типы | VARIANT | VARIANT | Variant | ms.com.Variant |
BSTR | BSTR | String | java.lang.String | |
VARIANT_BOOL | short [-1/0] | Boolean [True/False] | boolean [true/false] |
Рис. 2.6. Базовые типы СОМ
Все символы в СОМ представлены с использованием типа данных OLECHAR. Для Windows NT, Windows 95, Win32s и Solaris OLECHAR — это просто typedef для типа данных С wchar_t. Специфика других платформ описана в соответствующих документациях. Платформы Win32 используют тип данных wchar_t для представления 16-битных символов Unicode. Поскольку типы указателей в IDL созданы так, что указывают на одиночные переменные, а не на массивы, то IDL вводит атрибут [string], чтобы подчеркнуть, что указатель указывает на массив-строку с завершающим нулем:
HRESULT Method([in, string] const OLECHAR *pwsz);
Для определения строк и символов, совместимых с OLECHAR, в СОМ введен макрос OLESTR, который приписывает букву L перед строковой или символьной константой, информируя таким образом компилятор о том, что эта константа имеет тип wchar_t. Например, правильным будет такой способ инициализировать указатель OLECHAR с помощью строкового литерала: