Различия между MIDL и MkTypLib
Заметка
Средство Mktyplib.exe устарело. Вместо этого используйте компилятор MIDL.
Существует несколько ключевых областей, в которых компилятор MIDL отличается от MkTypLib. Большинство этих различий возникают, так как MIDL ориентирован больше на синтаксис C, чем MkTypLib.
Как правило, вы хотите использовать синтаксис MIDL в файлах IDL. Однако если необходимо скомпилировать существующий ODL-файл или иначе поддерживать совместимость с MkTypLib, используйте параметр /mktyplib203 компилятора MIDL, чтобы принудить MIDL вести себя как Mkktyplib.exeверсии 2.03. (Это последний выпуск средства MkTypLib.) В частности, параметр /mktyplib203 разрешает следующие различия:
Синтаксис typedef для сложных типов данных
В MkTypLib оба следующих определения создают TKIND_RECORD для "this_struct" в библиотеке типов. Тег "struct_tag" является необязательным и, если используется, не будет отображаться в библиотеке типов.
typedef struct struct_tag { ... } this_struct; typedef struct { ... } that_struct;
Если необязательный тег отсутствует, MIDL создаст его, эффективно добавляя тег в определение, предоставленное пользователем. Так как в первом определении есть тег, MIDL создаст TKIND_RECORD для "this_struct" и TKIND_ALIAS для "this_struct" (определение "this_struct" в качестве псевдонима для "struct_tag"). Так как тег отсутствует во втором определении, MIDL создаст TKIND_RECORD для имени, внутреннего в MIDL, который не имеет значения для пользователя и TKIND_ALIAS для "that_struct".
Это может повлиять на браузеры библиотек типов, которые просто отображают имя записи в пользовательском интерфейсе. Если вы ожидаете, что TKIND_RECORD иметь реальное имя, в пользовательском интерфейсе могут появиться нераспознанные имена. Это поведение также относится к объединениям и определениям перечисления с помощью компилятора MIDL, создающего TKIND_UNIONs и TKIND_ENUMs соответственно.
MIDL также позволяет структуруC, объединенияи определения перечисления. Например, следующее определение является законным в MIDL:
struct my_struct { ... }; typedef struct my_struct your_struct;
Логические типы данных
В MkTypLib логический типи логический тип данных MkTypLib приравнивается к VT_BOOL, который сопоставляется с VARIANT_BOOL, и который определяется как короткий короткий. В MIDL логический базовый тип эквивалентен VT_UI1, который определяется как без знака, а логический тип данных определяется как длинный. Это приводит к трудностям, если вы используете синтаксис IDL и синтаксис ODL в одном файле, пытаясь поддерживать совместимость с MkTypLib. Так как типы данных имеют разные размеры, маршалинг кода не будет соответствовать тому, что описано в сведениях о типе. Если требуется VT_BOOL в библиотеке типов, следует использовать тип данных VARIANT_BOOL.
Определения GUID в файлах заголовков
В MkTypLib идентификаторы GUID определяются в файле заголовка с макросом, который можно условно скомпилировать для создания предопределения GUID или экземпляра GUID. MIDL обычно помещает предопределения GUID в созданные файлы заголовков и экземпляры GUID только в файле, созданном параметром /iid.
Следующие различия в поведении нельзя устранить с помощью коммутатора /mktyplib203:
Конфиденциальность регистра
MIDL учитывает регистр, OLE Automation не является.
Область символов в объявлении перечисления
В MkTypLib область символов в перечислении является локальной. В MIDL область символов в перечислении является глобальной, так как она находится в C. Например, следующий код компилируется в MkTypLib, но создаст ошибку повторяющегося имени в MIDL:
typedef struct { ... } a; enum {a=1, b=2, c=3};
Область общедоступного атрибута
При применении атрибута общедоступного к блоку интерфейса MkTypLib обрабатывает каждый типdef внутри этого блока интерфейса как общедоступный. MIDL требует явного применения атрибута общедоступного к этим типизированным файлам, которые требуется открыть.
Порядок поиска importlib
При импорте нескольких библиотек типов, а если эти библиотеки содержат повторяющиеся ссылки, MkTypLib разрешает это с помощью первой ссылки, которую она находит. MIDL будет использовать последнюю ссылку, которую он находит. Например, учитывая следующий синтаксис ODL, библиотека C будет использовать moO typedef из библиотеки A, если компилироваться с помощью MkTypLib, а moO typedef из библиотеки B при компиляции с помощью MIDL:
[...]library A { typedef struct tagMOO {...}MOO } [...]library B { typedef struct tagMOO {...} MOO } [...]library C { importlib (A.TLB) importlib (B.TLB) typedef struct tagBAA {MOO y;}BAA }
Для этого необходимо указать каждую такую ссылку с правильным именем библиотеки импорта, как показано ниже.
typedef struct tagBAA {A.MOO y;}BAA
Тип данных VOID не распознаваем
MIDL распознает тип данных C-языка void и не распознает тип данных OLE Automation VOID. Если у вас есть ODL-файл, использующий VOID, поместите это определение в начало файла:
#define VOID void ''
Экспоненциальное представление
MIDL требует, чтобы значения, выраженные в экспоненциальной нотации, содержались в кавычках. Например, "-2.5E+3"
Значения и константы LCID
Обычно MIDL не учитывает LCID при анализе файлов. Чтобы принудительно применить это поведение для значения или использовать нотацию для конкретного языкового стандарта при определении константы, заключите значение или константу в кавычки.
Дополнительные сведения см. в разделе /mktyplib203, /iidи маршалинг типов данных OLE.