2014-07-28 2 views
1

Есть ли утилита для компиляции файла .ridl, используемого C++ Builder, для генерации заголовка C?Compiling .ridl file

Насколько я могу судить, TLIBIMP может извлекать только RIDL из TLB и генерировать заголовки C++ из TLB. Я не вижу возможности генерировать заголовки из RIDL.

с использованием Microsoft SDK 7.1 в "midl.exe" на .ridl файл я получаю кучу ошибок:

.\MyObject.ridl(114) : error MIDL2072 : inapplicable attribute : [version] [ Parameter 'param1' of Procedure 'func1' (Interface 'IMyObject') ] 

Также есть некоторые хорошие предупреждения:

.\MyObject.ridl(343) : warning MIDL2400 : for oleautomation, optional parameters should be VARIANT or VARIANT * : [optional] [ Parameter 'param2' of Procedure 'func2' (Interface 'IMyObject') ] 

который С тех пор я узнал, но не знал, когда изначально определяю свой интерфейс. Было бы неплохо иметь подобные предупреждения при определении интерфейса в C++ Builder.

Я предполагаю, что .ridl является расширением, изобретенным Embarcadero, а [version] является тегом в этом расширении. Ошибка конкретно относится к version(1.0), которая отображается в заголовке для enum s, которые я определил. (Каждое использование параметра enum в качестве параметра функции вызывает предупреждение).

(Если я исправлю ошибки, удалив этот лишний тег version, то он правильно создает заголовки, которые я могу использовать в программе на языке C, построенной с помощью C++ Builder).

ответ

3

A RIDL file относится только к компиляторам Embarcadero. Embarcadero использует RIDL вместо стандартного IDL, а RIDL не совместим с MIDL.exe.

В версиях до 2009 года IDE напрямую отредактировал файл TLB, а затем связал его как-есть в исполняемых файлах. Это было подвержено ошибкам, было трудно поддерживать и редактировать, и оно не подходило для систем VCS. Таким образом был создан RIDL, а файлы TLB стали промежуточными файлами, создаваемыми динамически во время компиляции проекта, например, OBJ и RES-файлы.

Нет инструмента для создания исходных файлов C/C++ непосредственно из файла RIDL. Тем не менее, есть инструмент GenTLB.exe для создания файла TLB из файла RIDL, а затем вы можете использовать инструмент для создания исходных файлов C/C++ из файла TLB.

Обратите внимание, что исходные файлы C/C++, сгенерированные TLIBIMP.exe, могут использоваться только в C++ Builder, поскольку они полагаются на специальные расширения компилятора Embarcadero и заголовки/типы RTL. Если вы хотите использовать TLB-файл с другими компиляторами, вам придется использовать свои собственные инструменты/возможности импорта TLB.

+0

Thanks Remy. На самом деле я смог генерировать заголовки C, используя MIDL после редактирования расширения Embarcadero. –

+0

Сводный вопрос, есть ли документация где-то точно, что расширения Embarcadero (выше спецификации MIDL)? –

+0

Атрибут '[version]' не является специфичным для Embarcadero, Microsoft также использует его, см. [Атрибут интерфейса] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa367054.aspx) и [атрибут версии] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa367306.aspx). RIDL является ** ограниченным ** IDL, Embarcadero пропускает вещи из RIDL, они не добавили к нему особых вещей. Звучит скорее как ошибка в вашей версии MIDL. –