2010-11-29 3 views
1

Я пытаюсь использовать COM-библиотеку в C++. У меня есть #import «TheLibrary.dll», и он создает файлы tlh и tli с классами в библиотеке.Временно #undef макросы при использовании директивы #import для импорта COM typelib

Теперь моя проблема заключается в том, что объект COM предоставляет несколько перечислений со значениями некоторых списков констант, которые также находятся в заголовках Windows SDK. Я предполагаю, что это так, что разработчики Visual Basic назвали варианты этих констант, вместо того, чтобы использовать их числовые значения.

Но это создает проблему для меня, поскольку эти заголовки включены до того, как мой typelib будет # import'ed; поэтому теперь объявления членов перечисления заменяются числовыми константами в файлах заголовков Windows, что приводит к сбою моей компиляции.

Пример:

окна заголовка файла:

#define RES_AND ((ULONG) 0x00000000) 

генерироваться TLH:

enum __declspec(uuid(-some guid-)) 
RestrictionKind 
{ 
    RES_AND = 0, 
.. etc 

Таким образом, проблема очевидна; перечисление в tlh расширяется, и результатом является попытка назначить константу числу.

Теперь я вижу несколько решений, все они непривлекательны:

  • сделать «» переименования по каждому пункту, в момент #import. Есть сотни этих констант, не ожидающих этого.

  • Оставлять без перечисления вместе. Это серьезно испортило бы мой доступ к объекту COM (я еще не пробовал это, возможно, вся библиотека даже станет непригодной).

  • do #undef всех этих констант перед #import. Опять же, есть сотни из них, и на вершине, что я не был бы в состоянии использовать их позже - если я снова сделать #define ...

Так я вроде в убыток Вот. Я надеюсь на способ массового переименования значений перечисления, но документация по директиве #import не дает мне большой надежды.

Любые идеи среди немногих оставшихся программистов COM там? Благодарю.

+0

Вы преувеличиваете, без сомнения. Получение сотен конфликтов имен макросов просто не происходит.Просто #undef их. Откажитесь от COM, когда получите более дюжины. – 2010-11-29 13:54:18

+0

Я просто написал сценарий для создания записей rename() из предупреждений компилятора. Было 834 конфликта. Я получил его, чтобы скомпилировать сейчас, все, кажется, все в порядке. Отказ от этого компонента не является вариантом (хорошо в программировании все всегда есть вариант - допустим, «отказ от этого компонента потребует от меня дублирования 5 лет работы, тестирования и работы с ошибками в другом, несвязаном приложении, что это COM-компоненты с интерфейсом '). – Roel 2010-11-29 14:10:07

ответ

0

У вас есть три варианта.

Вариант 1. Если вы можете изменить этот компонентный интерфейс - сделайте это, переименуйте значения перечисления, чтобы они не конфликтуют с Windows SDK.

Вариант 2. Использовать #import с rename. Хотя у вас есть сотни этих элементов, вы можете построить красивую таблицу, разделяющую список с использованием обратных косых черт.

Вариант 3. Попробуйте изолировать #import в отдельный файл .h, чтобы он не был включен во все SDK Windows или, по крайней мере, был импортирован с гораздо меньшим количеством файлов. Это позволит устранить или уменьшить конфликты, а затем вы можете использовать rename для остальных конфликтов.

 Смежные вопросы

  • Нет связанных вопросов^_^