블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

05-04 21:55

Recent Post

Recent Comment

Recent Trackback

Archive

2015. 5. 11. 15:28 Programming/COM

이글은 '선문비트 고급과정'에서 강의받은 내용을 토대로 작성하였으며, 비트 교육센터 자료를 참고하여 올린내용입니다. 

문제가 될시 삭제가 될 수 있습니다.


작성날짜    : 2011-03-17


IDL/MIDL

 

* IDL(Interface Definition Language) : 인터페이스를 정의하는 언어이다.

(외부에 Interface를 알려 주기 위해서 사용된다.)

* midl로 컴파일 하면, 프로그램에서 사용 가능한 interface 헤더 파일과 guid에 대한 정보를 제공해 준다.

* IDL은 실행형 컴포넌트(exe)를 사용하기 위한 Proxy와 Stub 코드들을 자동으로 생성한다.

* IDL을 이용하여 개발자는 쉽게 복잡한 인터페이스를 정의할 수 있다.

 

예제 소스

import "unknwn.idl";

[

        object,

        uuid(34BA4A55-B732-43ca-9366-A12C7C069989),

        helpstring("ICalcu interface"),

        pointer_default(unique)

]

interface ICalcu:IUnknown

{

        HRESULT Sum ([inint x, [inint y, [out]int* z);

        HRESULT Sub ([inint x, [inint y, [out]int* z);

};

[uuid(F66305A1-CE38-4643-91F7-37B1745217D2) ]

coclass COMPONENT

{      

        interface ICalcu;

};

 

IDL 키워드

object : object 특성으로 시작하는 인터페이스는 COM 인터페이스 임을 의미한다.

uuid : interface에 대한 guid값을 넣는다.

helpstring : 타입 라이브러리에 interface에 대한 문자열 정보이다.

pointer_default : 포인터를 다루는 방법에 대한 타입을 지정한다.

         full pointer(ptr) : C++ 형식의 포인터, 하나 이상의 포인터가 동일한 메모리 위치를 가리키는 것을 가능하게 함(포인터 앨리어싱)

         Unique pointer(unique) : 데이터의 앨리어싱을 허용하지 않는다.MIDL 컴파일러는 이러한 가정을 통하여 효율적인 마샬링 코드를 생성한다.(유일하게 하나만 가리키게 한다.)

         Reference Pointer(ref) : 포인터는 NULL값을 가질 수 없고, 항상 유효한 메모리 주소를 참조해야 한다.

 

(input parameter인지 output parameter인지 지정을 해줄 수 있음)

[in] : midl은 데이터가 클라이언트에서 컴포넌트로 전달되어야 한다는 것을 알린다.

[out] : 컴포넌트에서 클라이언트로 정보를 제공해야 함을 알린다.

[retval] : 클라이언트가 메소드에 접근 시 return 값을 갖는 함수를 생성한다.

 

CoClass

coclass : 컴포넌트에 대한 선언을 시작한다.

uuid : CLSID에 대한 GUID 값을 지정한다.

- coclass 내에는 컴포넌트가 지원하고 있는 interface에 대한 정보를 제공해준다.

- COMPONENT 및 ICalcu 로 선언된 ID값에 대해서 MIDL은 자동적으로 각각 CLSID_COMPONENT와 IID_ICalcu로 제공해준다.

 

IDL은 어떤 부분을 대체 할까?

Guid 부분과 Interface 선언부분을 대신해준다.

 

midl.exe

- InsideComIdl.Idl  파일을 midl로 컴파일 하면 4개의 파일을 생성해준다.

         InsideComIdl_I.c : GUID값이 정의되어 있는 파일

         InsideComIdl.h  : 인터페이스에 대한 정보가 선언 되어 있는 파일

         InsideComIdl_p.c : 인터페이스에 대한 Proxy/Stub 코드가 정의된 파일

         dlldata.c   :  Proxy/Stub 코드에 대한 DLL을 구현하는 파일

- InProcess Server에서는 InsideComIdl_I.c파일과 InsideComIdl.h파일을 프로젝트에 include하여 사용할 수 있다.

- Local Server 는 네개의 파일을 이용하여 쉽게 구현 가능하다.

프로젝트에서 IDL 파일은 가장 먼저 컴파일 되어야 한다.

IDL Compile

Idl 파일을 선택후 Project -> Settings -> 일반에서 “빌드에서 제외”를 “예”로 변경한다.

 

 

출력에서 출력 디렉터리를 “OutDir”로 설정한다.

 

 

 


그리고 명령줄에서 추가 옵션으로 “.\IDL.idl"을 써준다.

(idl파일의 경로를 지정해주는 것.)


IDL 
을 컴파일 한후 생성된 파일


'Programming > COM' 카테고리의 다른 글

[COM] ActiveX Control(Graph)  (0) 2015.05.11
[COM] ATL / COM  (0) 2015.05.11
[COM] IUnknown  (0) 2015.05.11
[COM] COM 이란?  (0) 2015.05.11
[COM] Class Factory  (0) 2015.05.11
posted by Kanais