다음을 통해 공유


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 import 문은 여기서 사용자 정의 형식이 포함된 헤더 파일 Mydefs.h와 IFace1 및 IFace2가 파생되는 IUnknown의 정의를 포함하는 Unknwn.idl을 가져오는 데 사용됩니다.

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

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

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

in directional 매개 변수는 호출자에 의해서만 설정된 매개 변수를 지정합니다. 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
 

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

IFace3의 이중 특성은 디스패치 인터페이스와 COM 인터페이스 모두인 인터페이스를 만듭니다. IDispatch에서 파생되므로 이중 인터페이스는 oleautomation 특성이 지정하는 Automation을 지원합니다. IFace3은 Oaidl.idl을 가져와 IDispatch의 정의를 가져옵니다.

라이브러리 문은 자체 uuid, helpstring버전 특성이 있는 ExampleLib 형식 라이브러리를 정의합니다.

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

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

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

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