반응형

이젠 실제 IDL코딩을 해보자.


간단하게 Visual C++ 6.0 이나 Visual C++.net 에서 ATL 프로젝트를 구성한다.


일단은 Visual C++ 6.0을 기준으로 설명한다.

(6.0에서라면 Project  생성시 맨 위에 나오는 ATL COM App Wizard가 되겠지....)


일단 프로젝트를 구성하면 기본적으로 Visual C++에 의해 여러 파일이 생성되는데, 그 안에서 확장자가 IDL인 파일을 볼 수 있다. 기본적으로 구성되는 IDL파일의 내용은 다음과 같다.


import "oaidl.idl";
import "ocidl.idl";
[
 uuid(64A72278-8D6D-415E-8F47-0D89626C8F6A),
 version(1.0),
 helpstring("Test 1.0 Type Library")
]
library TESTLib
{
 importlib("stdole32.tlb");
 importlib("stdole2.tlb");
};
 
C와 비슷하지만 C는 아닌 IDL문법이다.
import는 C의 include와 같다고 생각하면 되며, importlib역시 같은 개념이다.
주의 깊게 봐야 할것은 []안에 들어있는 내용이다.
uuid는 이전에 설명한 GUID값이다. 이 값의 내용은 의미가 없고, 단지
전세계에서 유일한 값이라는 게 중요하다. 이 값은 Visual C++에 같이 포함된 guidgen에 의해
생성할수 있다.
version은 말그대로 버전이며, helpstring은 이 라이브러리에 대한 설명이다.
helpstring에 작성한 내용은 이 라이브러리를 사용하는 개발자에게 노출되는 내용이다.
특히 COM객체를 사용하는 개발자의 입장에서는 이 정보를 보고 라이브러리르 사용하게 된다.
 

프로젝트 안에 COM Object를 생성하면 WorkSpace의 Class View는 열쇠모양의 인터페이스가 생성된다.

사용자 삽입 이미지
 
이를 더블클릭하면 IDL파일 구문으로 갈수 있다. IDL에서 기본적으로 생성되어 있는 구문들을 살펴보면 다음과 같다. import "ocidl.idl" 밑에 구문이 추가된것을 알 수있다.
 
import "oaidl.idl";
import "ocidl.idl";
 [
  object,
  uuid(40F4F436-8A41-4FF2-95C4-A1FDF60A152D),
  dual,
  helpstring("ICTest Interface"),
  pointer_default(unique)
 ]
 interface ICTest : IDispatch
 {
 };
[
 uuid(64A72278-8D6D-415E-8F47-0D89626C8F6A),
 version(1.0),
 helpstring("Test 1.0 Type Library")
]
...
...
...
 
필자는 COM의 여러가지 Object Type중에 Simple object를 선택했다.
object는 말그대로 Object라는 의미이며, uuid는 위와 마찬가지로 세계유일의 값으로
이 OCM오브젝트를 다른 오브젝트와 구별하는 값이다.
dual은 dual interface를 지원한다는 의미인데.....
이 부분은 설명이 좀 어렵다. 대충 basic과 같은 가상함수 포인터를 지원하지 않는 언어를 위한 설정이라고 알아두자.(이 말은 dual이 없으면 basic에서 사용하기 까다롭다는 의미가 된다.)
pointer_default는 이 COM오브젝트를 메모리에 로딩하면 우선적으로 이 인터페이스를 디폴트 인터페이스로 사용한다는 의미가 된다.
COM은 내부적으로 COM Object안에 여러개의 인터페이스를 갖게되고, 각 인터페이스가 또 여러개의 함수를 갖게되는 구조를 가진다고 Core COM에서 설명한 적이 있다.
 
예를 들면, DirectX를 사용하기 위해 directX Library를 로딩하고 그중에서 DirectDraw를 사용한다고 하자. DirectDraw는 버전이 다양하다. 그렇지만 버전마다 CreateSurface라는 함수가 등장하는데, 이때 사용자가 DirectDraw7인터페이스를 사용하면 7버전의 CreateSurface가 사용되고, DirectDraw6인터페이스를 사용하면 6버전의 CreateSurface가 사용된다. 그런 이유로 Interface를 지정해주어야 하는데, 지정하지 않을경우 default interface를 기본 인터페이스로 사용한다.
 
(COM을 사용하는 입장에서 인터페이스를 일일히 코딩하는 C++에서는 이런 경우가 드물지만, 인터페이스 선택이 자동으로 이루어지는 베이직이나, ActiveX와 같은 COM모듈의 경우에는 기본 인터페이스는 아주 중요하다.)
 
다음에는 인터페이스내에 Method나 property들을 추가하는 부분을 살펴보도록 하자.
반응형

+ Recent posts