다음을 통해 공유


IDL 파일의 해부학

다음 예제 IDL 파일은 인터페이스 정의의 기본 구문을 보여 줍니다. 메모리 할당, 사용자 지정 마샬링 및 비동기 메시징은 사용자 지정 COM 인터페이스에서 구현할 수 있는 몇 가지 기능에 불과합니다. MIDL 특성은 COM 인터페이스를 정의하는 데 사용됩니다. MIDL 특성 요약을 포함하여 인터페이스 및 형식 라이브러리를 구현하는 방법에 대한 자세한 내용은 MIDL 프로그래머 가이드 및 참조에서 인터페이스 정의 및 형식 라이브러리 참조하세요. 모든 MIDL 특성, 키워드 및 지시문에 대한 전체 참조는 MIDL 언어 참조참조하세요.

Example.idl

다음 예제 IDL 파일은 두 개의 COM 인터페이스를 정의합니다. 이 IDL 파일에서 Midl.exe 프록시/스텁 및 마샬링 코드 및 헤더 파일을 생성합니다. 줄별 해부가 예제를 따릅니다.

//
// Example.idl 
//
import "mydefs.h","unknwn.idl"; 
[
object,
uuid(a03d1420-b1ec-11d0-8c3a-00c04fc31d2f),
] interface IFace1 : IUnknown
{
HRESULT MethodA([in] short Bread, [out] BKFST * pBToast);
HRESULT MethodB([in, out] BKFST * pBPoptart);
};
 
[
object,
uuid(a03d1421-b1ec-11d0-8c3a-00c04fc31d2f),
pointer_default(unique)
] interface IFace2 : IUnknown
{
HRESULT MethodC([in] long Max,
                [in, max_is(Max)] BkfstStuff[ ],
                [out] long * pSize,
                [out, size_is( , *pSize)] BKFST ** ppBKFST);
}; 
 

IDL 가져오기 문은 IFace1 및 IFace2가 파생되는 IUnknown정의를 포함하는 헤더 파일, 사용자 정의 형식을 포함하는 Mydefs.h 및 Unknwn.idl을 가져오는 데 사용됩니다.

개체 특성은 인터페이스를 개체 인터페이스로 식별하고 MIDL 컴파일러에 RPC 클라이언트 및 서버 스텁 대신 프록시/스텁 코드를 생성하도록 지시합니다. 기본 RPC 메커니즘이 네트워크 문제로 인해 완료되지 않는 호출에 대한 오류를 보고할 수 있도록 개체 인터페이스 메서드에는 반환 형식의 HRESULT있어야 합니다.

uuid 특성은 IID(인터페이스 식별자)를 지정합니다. 각 인터페이스, 클래스 및 형식 라이브러리는 고유한 식별자를 사용하여 식별해야 합니다. 유틸리티 Uuidgen.exe 사용하여 인터페이스 및 기타 구성 요소에 대한 고유한 ID 집합을 생성합니다.

인터페이스 키워드는 인터페이스 이름을 정의합니다. 모든 개체 인터페이스는 IUnknown직접 또는 간접적으로 파생되어야 합니다.

방향 매개 변수의호출자만 설정하는 매개 변수를 지정합니다. out 매개 변수는 호출자에게 다시 전달되는 데이터를 지정합니다. 한 매개 변수에서 두 방향 특성을 모두 사용하면 매개 변수가 메서드에 데이터를 보내고 데이터를 호출자에게 다시 전달하는 데 모두 사용되도록 지정합니다.

pointer_default 특성은 매개 변수 목록에 포함된 포인터를 제외한 모든 포인터에 대해 기본 포인터 형식(고유, ref또는 ptr)을 지정합니다. 기본 형식이 지정되지 않은 경우 MIDL은 단일 포인터가 고유한 가정합니다. 그러나 여러 수준의 포인터가 있는 경우 기본 형식을 고유한 하려는 경우에도 기본 포인터 형식을 명시적으로 지정해야 합니다.

앞의 예제에서 BkfstStuff[ ] 배열은 규칙 배열런타임에 결정되는 크기입니다. max_is 특성은 배열 인덱스의 최대값을 포함하는 변수를 지정합니다.

size_is 특성은 배열의 크기를 지정하거나 이전 예제와 같이 여러 수준의 포인터를 지정하는 데도 사용됩니다. 이 예제에서는 반환되는 데이터의 양을 미리 알지 못하고 호출을 수행할 수 있습니다.

Example2.idl

다음 IDL 예제(이전 IDL 예제에 설명된 인터페이스를 다시 사용)는 인터페이스에 대한 형식 라이브러리 정보를 생성하는 다양한 방법을 보여 줍니다.

//
// Example2.idl
//

import "example.idl","oaidl.idl"; 

[
uuid(a03d1422-b1ec-11d0-8c3a-00c04fc31d2f),
helpstring("IFace3 interface"),
pointer_default(unique);
dual,
oleautomation
] 
interface IFace3 : IDispatch
{
   HRESULT MethodD([in] BSTR OrderIn,
                   [out, retval] * pTakeOut);
}; //end IFace3 def

[
uuid(a03d1423-b1ec-11d0-8c3a-00c04fc31d2f),
version(1.0),
helpstring("Example Type Library"),
] library ExampleLib
{
  importlib("stdole32.tlb");
  interface IFace3;
  [
  uuid(a03d1424-b1ec-11d0-8c3a-00c04fc31d2f),
  helpstring("Breakfast Component Class")
  ] coclass BkfstComponent
    {
    [default]interface IFace1;
    interfaceIFace2
    }; //end coclass def

[
uuid(a03d1424-b1ec-11d0-8c3a-00c04fc31d2f),
helpstring("IFace4 interface"),
pointer_default(unique);
dual,
oleautomation
] 
interface IFace4 : IDispatch
{
[propput] HRESULT MethodD([in] BSTR OrderIn);
[propget] HRESULT MethodE([out, retval] * pTakeOut);
}; //end IFace4 def
 
}; //end library def
 

기술 지원 특성은 선택 사항입니다. 개체를 간략하게 설명하거나 상태 줄을 제공하는 데 사용합니다. 이러한 도움말 문자열은 Microsoft Visual Basic과 함께 제공되는 것과 같은 개체 브라우저에서 읽을 수 있습니다.

IFace3의 이중 특성은 디스패치 인터페이스와 COM 인터페이스 모두인 인터페이스를 만듭니다. iDispatch 파생되었으므로 이중 인터페이스는 자동화를 지원하며, 이는 oleautomation 특성이 지정하는 것입니다. IFace3은 Oaidl.idl을 가져와 IDispatch정의를 가져옵니다.

라이브러리 문은 고유한 uuid, 기술 지원버전 특성을 포함하는 ExampleLib 형식 라이브러리를 정의합니다.

형식 라이브러리 정의 내에서 importlib 지시문은 컴파일된 형식 라이브러리를 가져옵니다. 모든 형식 라이브러리 정의는 Stdole32.tlb에 정의된 기본 형식 라이브러리를 가져와야 합니다.

이 형식 라이브러리 정의는 형식 라이브러리에 인터페이스를 포함하는 세 가지 방법을 보여 줍니다. IFace3은 라이브러리 문 내에서 참조하는 것만 포함됩니다.

coclass 문은 이전에 정의된 두 개의 인터페이스인 IFace1 및 IFace2를 포함하는 완전히 새로운 구성 요소 클래스인 BkfstComponent를 정의합니다. 기본 특성은 IFace1을 기본 인터페이스로 지정합니다.

IFace4는 라이브러리 문 내에 설명되어 있습니다. methodD의 propput 특성은 메서드가 같은 이름의 속성에 대해 set 동작을 수행한다는 것을 나타냅니다. propget 특성은 메서드가 메서드와 같은 이름의 속성에서 정보를 검색한다는 것을 나타냅니다. MethodD의 재검사 특성은 함수의 반환 값을 포함하는 출력 매개 변수를 지정합니다.