VC ++: директива #import: как указать версию библиотеки? - PullRequest
0 голосов
/ 02 августа 2011

Согласно MSDN , есть атрибут версии, но если вы укажете неправильный номер версии, VC все равно компилирует код.Например:

// MSO.DLL (Microsoft Office, Object Library)
//  Office 10.0 => version(2.2)
//  Office 11.0 => version(2.3)
//  Office 12.0 => version(2.4)
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" version(123.456) //< wrong version.

Как заставить сбой компилятора в таком коде?Я хотел бы использовать только конкретную версию библиотеки типов.

1 Ответ

1 голос
/ 02 августа 2011

Вы не можете.Правила описаны в LoadRegTypeLib:

LoadRegTypeLib сравнивает запрошенные номера версий с найденными в системном реестре и выполняет одно из следующих действий:

  • Если одно иззарегистрированные библиотеки в точности совпадают с запрошенными номерами старших и младших версий, затем эта библиотека типов загружается.
  • Если одна или несколько зарегистрированных библиотек типов точно соответствуют запрошенному номеру основной версии и имеет больший младший номер версии, чем запрошенный, загружается библиотека с наибольшим младшим номером версии.
  • Если ни одна из зарегистрированных библиотек типов точно не соответствует запрошенному основному номеру версии (или если ни одна из тех, которые точно соответствуют основному номеру версии, также не имеет вспомогательного номера версии, большего или равного запрошенному вспомогательному номеру версии), затем LoadRegTypeLib возвращает ошибку.

Ваш случай соответствует 2-му пункту, а не 3-му.Microsoft тратит много усилий на то, чтобы сделать эти библиотеки типов обратно совместимыми.Не воспользоваться этим легко.Создайте свой проект на машине с правильной библиотекой типов.Скопируйте сгенерированные файлы .tlh и .tli в каталог вашего проекта и зарегистрируйте их. Замените #import на #include для этих файлов.

...