Любой способ решить ошибки C4772 без регистрации DLL? - PullRequest
3 голосов
/ 23 сентября 2010

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

Ответы [ 3 ]

2 голосов
/ 24 октября 2014

Есть хороший вариант: добавить путь к файлам .tlb в каталоги VC ++ -> Исполняемые каталоги. Это добавляет путь к переменной среды PATH, которая будет указана компилятору.В соответствии с этим: http://msdn.microsoft.com/en-us/library/sce74ah7.aspx все ссылки .tlb в импортированных файлах ищутся только в PATH и LIB.

2 голосов
/ 23 сентября 2010

Попробуйте сначала импортировать указанный A.tlb или перечислить его при импорте B.tlb, используя опцию include ().

Только # import части интерфейса, которые вы планируете использовать, если вы можете избежать ненужного ввода других ссылок.

1 голос
/ 15 января 2013

Самый простой способ поместить все файлы * .tlb в каталог, когда они используются.

Зависит от конфигурации вашего проекта.Скопируйте все файлы * .tlb в: $ (OutDir), $ (ProjectDir), dir где находится файл с #import, dir при генерации * .tlb и т. Д.

С уважением, Мариуш

...