반응형

이번에는 IDL의 주요 키워드들에 대해서 적어본다.


다음은 Test ATL Project를 생성한 상태의 IDL파일의 소스의 일부이다.이다.


import "oaidl.idl";
import "ocidl.idl";
 [
  object,
  uuid(40F4F436-8A41-4FF2-95C4-A1FDF60A152D),
  dual,
  helpstring("ICTest Interface"),
  pointer_default(unique)
 ]
 interface ICTest : IDispatch
 {
  [id(1), helpstring("method TestMethod")] HRESULT TestMethod();
 };


import는 다른 IDL을 포함하는 명령어로써 C++의 include와 같다고 생각하면 쉽다.


object는 설명할 인터페이스가 object형태로 구현될 것이라는 걸 의미한다.


uuid는 이 인터페이스를 세계에서 유일한 존재로 만드는 고유한 ID값이다. 이전에 소개한 GUID이다.


dual은 이 인터페이스가 dual interface를 지원한다는 것을 의미한다. 언어들마다 제각각의 특성이 있어서 실제 객체를 호출하는 과정이 다를수 있다. 이 객체는 Dual Interface를 지원함으로써 Visual Basic과 같은 언어에서도 이 COM Object를 간단하게 사용할수 있다.


Helpstring은 이 COM 오브젝트를 사용하는 클라이언트에게 보여지는 이 객체에 대한 설명을 담는다.


pointer_default는 COM오브젝트의 생성시 기본적으로 가르킬 defaultpointer로써 이 인터페이스를 사용한다는 것이다. 정리하자면 이렇다. COM의 서비스를 사용하기 위해서 클라이언트는 COM객체를 생성한다. 그리고 나서, 그 객체의 인터페이스를 통해 서비스를 이용한다. 이때 객체가 생성되면 기본적으로 이 인터페이스를 가르킨다는 얘기다.


interface는 현재 이 인터페이스를 정의하는 부분이다.


id는 메서드, 또는 프로퍼티의 고유한 번호로써 자동으로 생성된다.


여기 빠진 것으로 HRESULT TestMethod();
에서 파라미터가 있는경우 [in],[out],[retval]등이 들어갈수 있다.


예를 들면 이렇다.


HRESULT TestMethod([in]int a,[retval,out]int* b);


in은 a라는 값이 클라이언트로부터 COM 객체 안으로 들어가는 방향을 나타내며, out은 그 반대이다.


retval은 매우 중요하고 자주 쓰일수 있다. retval은 리턴값을 나타낸다.이 함수의 실제 리턴값을 의미한다는 것이다. 그렇다면, HRESULT는 무엇인가? 하는 의문을 가질수 있다. HRESULT는 COM객체와 이를 사용하는 클라이언트 사이의 통신에 대한 정보를 담는 리턴값이다. 이 함수가 성공했는지, 실패했다면 무슨 이유로 이 함수의 호출이 실패 했는지에 대한 정보를 갖는다. 결국 클라이언트가 원하는 함수의 처리로 인한 리턴값은 int b가 된다.


 예를 들면 위의 TestMethod를 사용하는 VIsual Basic클라이언트의 입장에서의 코딩은


    TestMethod 1,b

이 아닌

    int b = testmethod 1

라고 쓰여져야 한다.

만일 IDL에

    HRESULT TestMethod([in]int a,[out]int* b);

라고 정의 되어 있다면 Basic에서는

  TestMethod 1,b

 로 호출될 것이다.


여기서 in,out은 써주지 않아도 되지만, COM객체가 마샬링이 필요한 경우, 다시말해 COM객체가 다른 PC에 있거나 exe형태로 존재하는 out-process일때는 in,out을 써주는 것에 따라 성능 차이를 가져올수 있다.

반응형

+ Recent posts