Изменить IDL сгенерированный заголовочный файл - PullRequest
5 голосов
/ 28 января 2011

Я работаю над устаревшим COM-проектом c ++, который я перенесу в Visual Studio 2010. В файле IDL для этого проекта мне нужно сослаться на файл ODL из другого проекта c ++.Моя проблема в том, что другой проект генерирует свой заголовочный файл как $ (filename) _h.h.Когда мой файл IDL генерирует свой заголовочный файл, он генерирует имя файла ODL как $ filename.h и не может ссылаться на правильный файл.

Другими словами, в моем файле IDL ("MyIDLFile.idl") У меня есть утверждение типа

import "MyODLFile.odl"

, которое в сгенерированном файле ("MyIDLFile.h") становится

include "MyODLFile.h"

когда мне нужно его сгенерировать

, включая «MyODLFile_h.h»

Как указать имя файла, который я хочу, чтобы IDL генерировал в операторе импорта?

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Я не уверен, что вы имеете в виду в операторе импорта, но то, что вы ищете, может быть найдено в разделе свойств проекта.Перейдите в окно свойств (Alt-F7) и в разделе «Configuration Properties / MIDL / Output» у вас будет возможность объявить заголовочный файл, который вы хотите его создать.Поскольку ваш проект является устаревшим, может быть проще просто удалить «_h» из имени файла заголовка (например, $ (ProjectName) .h вместо $ (ProjectName) _h.h).Подробнее см. http://support.microsoft.com/kb/321274.

0 голосов
/ 18 мая 2018

Это распространенная проблема, которую необходимо решить при работе с файлами IDL. Хорошо, что есть несколько способов решить эту проблему:

  1. Использование параметров компилятора MIDL для изменения сгенерированного вывода
  2. Слой вашего компонента, чтобы конфликтующие файлы компилировались по разным путям. Вы также можете контролировать, как сгенерированные файлы публикуются. Затем код, который должен включать его, может контролировать, откуда включаются файлы.

Ваше окончательное решение может использовать немного # 1 и # 2.

Компилятор MIDL имеет несколько опций для изменения имен выходных файлов или исключая выходные файлы.

Прямое указание имен:

                         -OUTPUT FILE NAMES-
/cstub filename    Specify client stub file name
/dlldata filename  Specify dlldata file name
/h filename        Specify header file name
/header filename   Specify header file name
/iid filename      Specify interface UUID file name
/proxy filename    Specify proxy file name
/sstub filename    Specify server stub file name
/tlb filename      Specify type library file name

Пропуск выходных файлов:

                       -OUTPUT FILE GENERATION-
/client none       Do not generate client files
/server none       Generate no server files
/notlb             Don't generate the tlb file

Лично я использовал опцию / prefix, чтобы избежать коллизий заголовков в прошлом.

/no_default_epv    Do not generate a default entry-point vector
/prefix client str Add "str" prefix to client-side entry points
/prefix server str Add "str" prefix to server-side manager routines
/prefix switch str Add "str" prefix to switch routine prototypes
/prefix all str    Add "str" prefix to all routines

Вот пример этого:

/prefix client HIDE_

Интерфейс с методом foo будет переименован в HIDE_foo в заголовке.

Другая стратегия, которая работает, связана с тем, как вы наслоите свои каталоги, упорядочите их, и опубликуете файлы, и используете пути включения, и упорядочите фактические включения. Я привык использовать источники только с файлами dir и build.exe, поэтому не могу дать совет, как это работает с VS.

0 голосов
/ 10 декабря 2014

Это, кажется, распространенная проблема, я не смог найти хорошего решения, но один из обходных путей - добавить '_i' к вашим файлам idl, например, EquipmentConstants_i.idl

Microsoft ссылаетсяпереключатель компиляции / header, но я не смог заставить его работать ( midl / заголовок ).

...