이글은 '선문비트 고급과정'에서 강의받은 내용을 토대로 작성하였으며, 비트 교육센터 자료를 참고하여 올린내용입니다.
문제가 될시 삭제가 될 수 있습니다.
작성날짜 : 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 ([in] int x, [in] int y, [out]int* z);
HRESULT Sub ([in] int x, [in] int 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 |