2016-08-11 3 views
0

Visual Studio 2015를 사용하며 COM 인터페이스를 정의하고 컴파일시 .tlb 파일을 생성하는 C# Application-Project가 있습니다. 이제 그 Csharp.tlb를 idl로 가져 오려고합니다.컴파일러 오류 C3646 idl에서 importlib을 사용할 때 자동 생성 .tlh에서 알 수없는 재정의 지정자

MyLibrary.idl :

컴파일시
import "oaidl.idl"; 
import "ocidl.idl"; 
import "Cplusplus.idl"; 

library MyLibrary 
{ 
    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 
    importlib("Csharp.tlb"); 

    interface IMyCOM : IDispatch 
    { 
    [propget, id(1)] 
    HRESULT CpluplusObject 
    (
     [out,retval] ICplusplusObject** cplusplusObject 
    ); 

    [propget, id(2)] 
    HRESULT CsharpObject 
    (
     [out, retval] ICsharpObject** csharpObject 
    ); 
    } 

    coclass MyCOM 
    { 
    [default] interface IMyCOM; 
    }; 
} 

내가 얻을 C3646 'csharpObject'

오류 : 알 수없는 재정의 지정 MyLibrary.tlh에서이

MyLibrary.tlh가 자동으로 생성 컴파일은 다음과 같습니다.

MyLibrary.tlh :

#pragma once 
#pragma pack(push, 8) 

#include <comdef.h> 

namespace MyLibrary { 

    struct __declspec(uuid("8e664998-bc93-48e7-adcc-84fc8598cd5d")) 
    /* dual interface */ ICplusplusObject; 

    _COM_SMARTPTR_TYPEDEF(ICplusplusObject, __uuidof(ICplusplusObject)); 

    struct __declspec(uuid("388ebf11-05c8-4b86-b2bd-60f0ef38695e")) 
    IMyLibrary : IDispatch 
    { 
    __declspec(property(get=GetCplusplusObject)) 
    ICplusplusObjectPtr cplusplusObject; 
    __declspec(property(get=GetCsharpObject)) 
    ICsharpObjectPtr csharpObject; 

    ICplusplusObjectPtr GetCplusplusObject (); 
    ICsharpObjectPtr GetCsharpObject (); 

    virtual HRESULT __stdcall get_CplusplusObject (
     /*[out,retval]*/ struct ICplusplusObject * * cplusplusObject) = 0; 
    virtual HRESULT __stdcall get_CsharpObject (
     /*[out,retval]*/ struct ICsharpObject * * csharpObject) = 0; 
    } 

    __declspec(implementation_key(1)) ICplusplusObjectPtr IMyLibrary::GetcplusplusObject (); 
    __declspec(implementation_key(2)) ICsharpObjectPtr IMyLibrary::GetcsharpObject (); 
} 

오류는 지금까지 이해하고있는 ICsharpObjectPtr 또는 ICsharpObject 각각을 알 수 없다는 의미입니다. "ICplusplus.idl"가져 오기가 .tlh 및 importlib ("ICsharp.tlb")에 정의를 추가 했으므로 ICplusplusObjectPtr이 알려져 있습니다. 분명히하지 않았다.

테스트 목적으로 OLE/COM Object Viewer를 사용하여 .tlb에서 ICsharp.idl을 생성하고 해당 idl을 가져 왔습니다. 그 후에 오류는 사라졌습니다.

그러나 .tlb의 importlib가 왜 직접 작동하지 않습니까? 내가 .tlb 밖으로 매번 idl 파일을 생성하고 싶지 않습니다.

"ICsharp.tlh"가 없거나 .tlh로 알려진 유형을 만들기위한 것이 있다고 생각합니다. 하지만 idl 또는 컴파일러에게 ICsharpObject를 제대로 참조하도록 지시하는 방법은 무엇입니까?

도움을 주셔서 대단히 감사합니다.

+0

'library' 블록의 중간에 메소드를 정의하고 있습니다. 그건 말이 안되요. 메소드는 자연스럽게 인터페이스의 일부 여야합니다. –

+1

'# import' 지시어에 ['auto_search'] (https://msdn.microsoft.com/en-us/library/0346ezww.aspx) 속성을 사용하고 싶습니다. 그렇지 않으면 명시 적으로'# import' Csharp.tlb를 먼저 쓰십시오. –

+0

MyLibrary.idl 코드를 수정했습니다. 인터페이스를 적어 놓은 것을 이미 잊어 버렸습니다. 고맙습니다. – MaLe

답변

0

이것은 tlb-imports의 잘못된 순서로 인한 오류입니다. #import 지시문은 컴파일시 기본 (.tlh) 및 보조 (.tli) 헤더 파일을 생성합니다. tlb가 먼저 가져 오지 않은 다른 형식 라이브러리 유형을 사용하면이 오류가 발생합니다. 이 경우 다음 너무 이고르 감사

#import "CplusplusLibrary.tlb" 
#import "CsharpLibrary.tlb" 
#import "MyLibrary.tlb" 

Importer.cpp

오류를

를 해결했다.

관련 문제