C4772, даже когда библиотека типов зарегистрирована и присутствует - PullRequest
3 голосов
/ 05 марта 2010

У меня есть набор COM-проектов Visual C ++ 9, зависящих друг от друга.

ComponentA публикует свою библиотеку типов в ComponentA.tlb. ComponentB импортирует ComponentA.tlb в ComponentB.idl и публикует ComponentB.tlb. Сигнатуры методов в ComponentB.idl содержат параметры типов, определенных в ComponentA.tlb. Проекты ComponentA и ComponentB компилируются без ошибок.

ComponentC #import с ComponentA.tlb и ComponentB.tlb в stdafx.h - это неожиданно завершается с

error C4772: #import referenced a type from a missing type library;

и позже набор

error C2440: 'return' : cannot convert from '__missing_type__ *' to '__missing_type__'

для упаковщиков, использующих типы, определенные в ComponentA.tlb. Обычно это происходит, когда ComponentA.tlb не зарегистрирован, но я, безусловно, запускаю regtlib и вижу в regedit, что оно зарегистрировано. ComponentA.tlb присутствует точно по пути, указанному в реестре.

В чем источник проблемы и как ее можно решить?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2012

Не уверен, что у меня была та же проблема, что и у вас, но я получаю ошибку C4772 в моей первой сборке, а затем она исчезает во второй сборке.

Решением было скопировать A.tlb вdir проекта (скопируйте "$ (OutDir) \ A.tlb.") в качестве шага перед сборкой, затем удалите его как шаг после ссылки.

Моя программа выполняет #import для A.tlbзатем B.tlb (который зависит от типов в A.tlb).#Import of A.tlb успешно, но B.tlb не удалось.Оба TLB-файла находились в каталоге include, и ни один из лежащих в основе .DLL не был зарегистрирован с помощью regsvr32 (все работает нормально, если зарегистрированы COM-объекты).

Насколько я могу сказать, оператор #import не поддерживает C ++include path, поэтому он не смог найти A.tlb, когда A.dll не был зарегистрирован.

1 голос
/ 10 декабря 2010

Похоже, что проблема может быть связана с изменением интерфейсов ComponentA. Как только интерфейсы ComponentA изменяются во время регистрации его typelib, проблема начинает возникать.

Обходное решение, которое я использую, - это отменить регистрацию библиотеки компонентов и зарегистрировать ее снова - я создал небольшую программу (regtlib просто не может отменить регистрацию библиотеки типов), которая вызывает RegisterTypeLib() и UnregisterTypeLib() для этого и похоже, что проблема ушла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...