2013-03-11 2 views
2

저는 COM에서 비교적 새 것이므로 어리석은 질문 인 경우 사과합니다. 형식 라이브러리로 컴파일 된 COM 인터페이스가 많이 있습니다. A. 이 형식 라이브러리는 내 솔루션에있는 DLL 중 하나 (a.dll)의 리소스입니다. 별개의 DLL (b.dll)에 들어가는 별도의 형식 라이브러리 (B)에서 유형 라이브러리 A의 인터페이스를 구현하는 코 클라스를 정의하고 싶습니다.다른 유형 라이브러리의 인터페이스를 구현하는 COM 코 클라스

import "oaidl.idl"; 
import "ocidl.idl"; 

// Import IMyInterface, which is part of MyLibA.tlb 
import "MyInterface.idl"; 

[ 
    uuid(E80492A8-1E8C-4ABF-B4DE-9C252C445AFE), 
    version(1.0), 
    helpstring("MyLibB Type Library") 
] 
library MyLibB 
{ 
    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 
    importlib("MyLibA.tlb); 

    [ 
     uuid(25E3CD5E-FA06-4845-BE3E-F260985AFB20), 
     helpstring("My CoClass") 
    ] 
    coclass MyCoClass 
    { 
     [default] interface IMyInterface; 
    }; 
}; 

내가 위의 확인을 컴파일 할 수 있습니다,하지만 난는 OLEView에 관한 의해 생성 된 TLB 파일을 열 때, 나는 오류 메시지 TYPE_E_CANTLOADLIBRARY를 얻을 아래 내가 생각하고있는 것을의 간단한 예로서 IDL 코드를 참조하십시오. 나는 내가하고 싶은 일이 가능하지 않다고 생각하기 시작했다. 지금까지의 나의 실험은 형식 라이브러리가 coclass가 coclass 정의 자체와 함께 구현 한 모든 인터페이스를 포함 할 필요가 있다고 제안한다. 사실입니까? 나는 importlib("MyLibA.tlb); 문을 제거하면

, 나는 오류없이는 OLEView에서 컴파일 된 TLB 파일을 볼 수 있지만 MyLibB.tlb는 또한 IMyInterface 인터페이스의 정의, 즉 인터페이스가 모두 형식 라이브러리에 두 번 정의가 포함되어 있습니다. 내 응용 프로그램에서 나는 a.dllb.dll을 등록이 필요없는 COM을 사용하여로드하기 때문에 이것을 원하지 않습니다. 이 시나리오에서는 둘 이상의 유형 라이브러리에서 동일한 인터페이스 정의가 발견 될 경우 활성화 컨텍스트 생성이 실패합니다.

원하는 인터페이스와 coclass 분리를 별도의 형식 라이브러리에서 얻을 수있는 방법에 대한 제안 사항은 무엇입니까?

+0

감사합니다. 이제 OLEView에서 MyLibB.tlb의 tlb를 볼 수 있습니다. MyLibA.tlb을 등록하지 않은 이유는 등록 무료 COM을 사용했기 때문입니다. – themik81

+0

다른 사람이 유용하다고 생각할 때 주석을 제거하고 답변으로 추가했습니다. –

답변

3

OLE/COM 뷰어에 TYPE_E_CANTLOADLIBRARY이 표시되는 경우 이는 일반적으로 열려있는 것으로부터 참조되는 다른 TLB가 제대로 등록되지 않았 음을 의미합니다.

해결 방법은 시스템에 따라 regtlb 또는 regtlib 또는 대체 도구와 같은 종속성 TLB (이 경우 MyLibA.tlb)를 등록하는 것입니다.

등록이 필요없는 COM의 맥락에서 질문이 나오기 때문에 인터페이스 인스턴스의 마샬링과 관련하여 발생할 수있는 문제에 대해 알고 있어야합니다. 일반적으로 표준 마샬 러를 사용하려면 TLB를 등록해야합니다. 그렇지 않으면 언급 된 마샬링 정보를 올바르게 선언해야합니다. here

+0

그래, OLEView가 열리지 않기 때문에 tlb가 어떻게 든 손상되었다고 생각했지만 MyLibA.tlb가 등록되지 않았기 때문에 tlb가 손상되었다고 생각했습니다. 나는 나의 등록 무료 COM 시나리오에서 tlb가 등록되지 않고 내 코 클라스를 사용할 수 있다는 것을 확인했다. 단지 OLEView에 대한 등록 만 필요하다. – themik81

+0

tlbs가 등록되지 않았기 때문에 마샬링에 문제가있을 수 있으므로 답변에 메모를 추가했습니다. –

관련 문제