Есть ли способ устранить ошибки C4772 без необходимости регистрации DLL?

StackOverflow https://stackoverflow.com/questions/3773568

Вопрос

Я поддерживаю проект 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 и т. д.

Привет Мариуш

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top