2010-03-05 4 views
3

Visual C++ 9 COM 구성 요소 프로젝트 집합이 서로 종속되어 있습니다.형식 라이브러리가 등록되어있는 경우에도 C4772가 표시됩니다.

ComponentA는 ComponentA.tlb에 형식 라이브러리를 게시합니다. ComponentB는 ComponentA.tlbComponentB.idl으로 가져오고 ComponentB.tlb을 게시합니다. ComponentB.idl의 메소드 서명에는 ComponentA.tlb에 정의 된 유형의 매개 변수가 들어 있습니다. ComponentA 및 ComponentB 프로젝트 모두 올바르게 컴파일됩니다. stdafx.h

ComponentC #import S ComponentA.tlb 모두

ComponentB.tlb -이 갑자기 이상

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

과 함께 ComponentA.tlb에서 정의한 형식을 사용 랩퍼

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

세트 실패. 일반적으로 ComponentA.tlb이 등록되지 않았지만 regtlib을 실행하고 regedit에 등록되어 있는지 확인합니다. ComponentA.tlb은 레지스트리에 지정된 경로에 정확히 존재합니다.

문제의 근원은 무엇이며 문제가 어떻게 해결 될 수 있습니까?

+0

진행 상황 sharptooth? –

+0

@Matt Howells : Yeap, 상기시켜 줘서 고마워. 나는 나의 발견을 답으로 추가했다. – sharptooth

답변

1

문제는 ComponentA 인터페이스 변경으로 인한 것일 수 있습니다. 형식 라이브러리가 등록되어있는 동안 ComponentA 인터페이스가 변경되면 문제가 발생하기 시작합니다.

내가 사용하는 해결 방법은 ComponentA의 형식 라이브러리 등록을 취소하고 다시 등록하는 것입니다 - 나는 작은 프로그램을 제작 (regtlib 그냥 형식 라이브러리 등록을 취소 할 수 없습니다) 그것을 위해 RegisterTypeLib()UnregisterTypeLib()를 호출하고 문제가 없어 보이는 그.

2

내가 당신과 같은 문제가 있었는지 확실하지 않지만 첫 번째 빌드에서 C4772 오류가 발생하며 두 번째 빌드에서는 사라질 것입니다.

해결 방법은 빌드 전 단계로 A.tlb를 프로젝트 디렉토리 (copy "$ (OutDir) \ A.tlb.")에 복사 한 다음 링크 후 단계로 삭제하는 것입니다.

내 프로그램은 A.tlb, B.tlb (A.tlb의 유형에 따라 다름)에 #import를 수행합니다. #tport의 # import는 성공했지만 B.tlb는 실패했습니다. TLB 파일은 모두 include 디렉토리에 있고 기본 .DLL도 regsvr32로 등록되지 않았습니다 (COM 객체가 등록되어 있으면 모든 것이 잘 작동 함).

# import 문은 C++ include 경로를 따르지 않기 때문에 A.dll이 등록되지 않은 경우 A.tlb를 찾을 수 없습니다.

관련 문제