Все интерфейсы СОМ должны быть определены в 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 с помощью строкового литерала: