Есть ли способ устранить ошибки C4772 без необходимости регистрации DLL?
-
04-10-2019 - |
Вопрос
Я поддерживаю проект VS2010, в котором есть несколько COM-библиотек с перекрестными ссылками.Я пытаюсь настроить проект таким образом, чтобы его можно было собрать со случайной рабочей станции, на которой установлен VS2010.Рабочая станция может быть как 32-битной, так и 64-битной, поэтому, если я настрою проект на «регистрацию вывода», сборка не сможет собраться на 32-битной машине, поскольку 64-битную DLL невозможно будет загрузить для вызова DllRegisterServer.
Вот пример:Typelib из проекта B ссылается на typelib из проекта A.Проект C будет ссылаться на проект B посредством следующего утверждения:
#import "B.tlb"
Поскольку библиотека B ссылается на A, при импорте B.tlb компилятор пытается загрузить типы из A.Итак, если A не зарегистрирован, компиляция завершится неудачей:
error C4772: #import referenced a type from a missing type library ...
Я попытался открыть B.tlb с помощью приложения OleView, и он чертовски уверен, что показывает только правильное имя файла для ссылки на библиотеку A, если она зарегистрирована с помощью regsvr32.
Итак, мой вопрос здесь:Есть ли какой-либо альтернативный способ правильного разрешения ссылок на библиотеки без необходимости регистрации TLB, просто каким-то образом поместив все файлы в один и тот же каталог или прикрепив какой-то манифест?Например, переименуйте TLB библиотеки в .tlb или что-то в этом роде.
Решение
Попробуйте сначала импортировать указанный A.tlb или перечислить его в импорте B.tlb, используя опцию include().
Только #Импортировать части интерфейса, которые вы планируете использовать, если можете избежать ненужного использования других ссылок.
Другие советы
Есть хороший вариант:добавить путь к файлам .tlb в VC++ Directories -> Executable Directories При этом добавляется путь к переменной окружения PATH, которая будет передана компилятору.Согласно этому: http://msdn.microsoft.com/en-us/library/sce74ah7.aspx все .tlb, на которые ссылаются в импортированном файле, ищутся только в PATH и LIB.
Самый простой способ — поместить все файлы *.tlb в каталог, когда они используются.
Зависит от конфигурации вашего проекта.Скопируйте все файлы *.tlb в:$(OutDir), $(ProjectDir), каталог, в котором находится файл с #import, каталог при создании *.tlb и т. д.
Привет Мариуш