MIDL과 MkTypLib 간의 차이점

참고

Mktyplib.exe 도구는 사용되지 않습니다. 대신 MIDL 컴파일러를 사용합니다.

 

MIDL 컴파일러가 MkTypLib과 다른 몇 가지 주요 영역이 있습니다. MIDL이 MkTypLib보다 C 구문을 더 지향하기 때문에 이러한 차이점이 대부분 발생합니다.

일반적으로 IDL 파일에서 MIDL 구문을 사용하려고 합니다. 그러나 기존 ODL 파일을 컴파일하거나 MkTypLib와의 호환성을 유지해야 하는 경우 /mktyplib203 MIDL 컴파일러 옵션을 사용하여 MIDL이 Mkktyplib.exe 버전 2.03처럼 작동하도록 합니다. (MkTypLib 도구의 마지막 릴리스입니다.) 특히 /mktyplib203 옵션은 다음과 같은 차이점을 해결합니다.

  • 복합 데이터 형식에 대한 typedef 구문

    MkTypLib에서 다음 정의는 모두 형식 라이브러리에서 "this_struct"에 대한 TKIND_RECORD 생성합니다. "struct_tag" 태그는 선택 사항이며, 사용되는 경우 형식 라이브러리에 표시되지 않습니다.

    typedef struct struct_tag { ... } this_struct;
    typedef struct { ... } that_struct;
    

    선택적 태그가 없으면 MIDL에서 태그를 생성하여 사용자가 제공한 정의에 태그를 효과적으로 추가합니다. 첫 번째 정의에는 태그가 있으므로 MIDL은 "this_struct"에 대한 TKIND_RECORD "this_struct"에 대한 TKIND_ALIAS 생성합니다("this_struct"을 "struct_tag"의 별칭으로 정의). 두 번째 정의에 태그가 없으므로 MIDL은 MIDL 내부적으로 손상되는 이름에 대한 TKIND_RECORD 생성합니다. 이는 사용자에게 의미가 없으며 "that_struct"에 대한 TKIND_ALIAS 생성합니다.

    이는 단순히 사용자 인터페이스에 레코드의 이름을 표시하는 형식 라이브러리 브라우저에 영향을 미칠 수 있습니다. TKIND_RECORD 실제 이름이 있어야 하는 경우 인식할 수 없는 이름이 사용자 인터페이스에 나타날 수 있습니다. 이 동작은 UNION 및열거형 정의에도 적용되며 MIDL 컴파일러는 각각 TKIND_UNIONs 및 TKIND_ENUMs 생성합니다.

    MIDL은 C 스타일 구조체, 공용 구조체 및 열거형 정의도 허용합니다. 예를 들어 다음 정의는 MIDL에서 적합합니다.

    struct my_struct { ... };
    typedef struct my_struct your_struct;
    
  • Boolean 데이터 형식

    MkTypLib에서 부울 기본 형식 및 MkTypLib 데이터 형식 BOOL은 VARIANT_BOOL 매핑되는 VT_BOOL 동일하며 짧은 형식으로 정의됩니다. MIDL에서 부울 기본 형식은 부호 없는 문자로 정의된 VT_UI1 동일하며 BOOL 데이터 형식은 long으로 정의됩니다. 이로 인해 MkTypLib과의 호환성을 유지 관리하는 동안 동일한 파일에 IDL 구문과 ODL 구문을 혼합하는 경우 문제가 발생합니다. 데이터 형식은 크기가 다르기 때문에 마샬링 코드는 형식 정보에 설명된 것과 일치하지 않습니다. 형식 라이브러리에서 VT_BOOL 원하는 경우 VARIANT_BOOL 데이터 형식을 사용해야 합니다.

  • 헤더 파일의 GUID 정의

    MkTypLib에서 GUID는 GUID 사전 정의 또는 인스턴스화된 GUID를 생성하기 위해 조건부로 컴파일할 수 있는 매크로를 사용하여 헤더 파일에 정의됩니다. MIDL은 일반적으로 생성된 헤더 파일 및 GUID 인스턴스화에 GUID 사전 정의가 /iid 스위치에 의해 생성된 파일에만 배치됩니다.

/mktyplib203 스위치를 사용하여 다음과 같은 동작 차이점을 해결할 수 없습니다.

  • 대/소문자 구분

    MIDL은 대/소문자를 구분하며 OLE 자동화는 그렇지 않습니다.

  • 열거형 선언의 기호 범위

    MkTypLib에서 열거형의 기호 scope 로컬입니다. MIDL에서 열거형에 있는 기호의 scope C와 마찬가지로 전역입니다. 예를 들어 다음 코드는 MkTypLib에서 컴파일되지만 MIDL에서 중복 이름 오류가 생성됩니다.

    typedef struct { ... } a;
    enum {a=1, b=2, c=3};
    
  • public 특성의 범위

    인터페이스 블록에 public 특성을 적용하면 MkTypLib은 해당 인터페이스 블록 내의 모든 typedef를 public으로 처리합니다. MIDL을 사용하려면 public 특성을 공개 하려는 typedef에 명시적으로 적용해야 합니다.

  • Importlib 검색 순서

    둘 이상의 형식 라이브러리를 가져오고 이러한 라이브러리에 중복 참조가 포함된 경우 MkTypLib은 찾은 첫 번째 참조를 사용하여 이 문제를 해결합니다. MIDL은 마지막으로 찾은 참조를 사용합니다. 예를 들어 다음 ODL 구문을 고려할 때 라이브러리 C는 MkTypLib으로 컴파일하는 경우 라이브러리 A의 MOO typedef를 사용하고 MIDL로 컴파일하는 경우 라이브러리 B의 MOO typedef를 사용합니다.

    [...]library A
    {
        typedef struct tagMOO
        {...}MOO
    }
    
    [...]library B
    {
        typedef struct tagMOO
        {...} MOO
    }
    
    [...]library C
    {
        importlib (A.TLB)
        importlib (B.TLB)
        typedef struct tagBAA
        {MOO y;}BAA
    }
    

    이에 대한 적절한 해결 방법은 다음과 같이 각 참조를 올바른 가져오기 라이브러리 이름으로 한정하는 것입니다.

    typedef struct tagBAA
        {A.MOO y;}BAA
    
  • VOID 데이터 형식이 인식되지 않음

    MIDL은 C 언어 void 데이터 형식을 인식하고 OLE Automation VOID 데이터 형식을 인식하지 않습니다. VOID를 사용하는 ODL 파일이 있는 경우 파일 맨 위에 이 정의를 배치합니다.

#define VOID void '''

  • 지수 표기법

    MIDL을 사용하려면 지수 표기법으로 표현된 값이 따옴표 안에 포함되어야 합니다. 예: "-2.5E+3"

  • LCID 값 및 상수

    일반적으로 MIDL은 파일을 구문 분석할 때 LCID를 고려하지 않습니다. 값에 대해 이 동작을 강제 적용하거나 상수를 정의할 때 로캘별 표기법을 사용해야 하는 경우 값 또는 상수를 따옴표로 묶습니다.

자세한 내용은 /mktyplib203, /iid마샬링 OLE 데이터 형식을 참조하세요.