반응형

IDL에 함수와 프로퍼티를 추가하는 부분을 살펴보자.


ATL은 COM중에서도 C++을 사용하는 그것도, Visual C++를 사용하는 사람들을 위한


라이브러리이므로 C++과 같이 설명을 해보자.


아래 그림을 보면 Test라는 ATL 프로젝트의 ClassView 창이다.

(이 프로젝트의 생성과정은IDL(Interface Definition Language)(3)을 봐라.)


ICTest에서 오른쪽을 클릭하면 Add Method와 Add Property가 있다.

이들을 선택해서 함수를 추가하면 CCtest에도 함수가 생기고, ICTest밑에도 함수가 생긴다.

사용자 삽입 이미지

아래 그림은 TestMethod라는 함수를 추가한 후의 ClassView이다.

사용자 삽입 이미지

이전에 Visual C++에서 함수를 추가할 경우를 생각해보자.
클래스에 함수를 추가하면 클래스 밑에 함수가 생성되고, 그 안에 코드를 추가하면 되었다.
이는ATL에서 역시 동일하다. 그러나 위의 경우처럼 인터페이스에 함수를 추가하면,
클래스 안에도 함수가 생기고, 인터페이스에도 함수가 생기는 것을 볼수 있다.
 
이들의 차이는 뭘까?
인터페이스의 경우에는 외부에 노출되는 것이다.
 
다시말하면, 클래스에 단순히 추가한 함수는 이 ATL내에서는 사용가능하지만, 이 ATL Object를 사용하는 외부 프로그램은 사용할수 없지만, 인터페이스에 추가된 함수는 외부로 함수를 노출시켜,이를 사용할수 있다는 의미이다.
 
함수를 추가하면 이전 장에서 보았던 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(); <-- 추가된 부분
 };
 
id(1)은 이 함수의 ID이며, helpstring은 이 인터페이스를 사용하는 클라이언트를 위한 설명이다.
HRESULT는 모든 COM함수의 규약이다. 모든 COM함수는 HRESULT를 리턴해야만 한다.
 
자동으로 생성되는 IDL파일이지만, 그리고 이 부분은 C++가 아니지만, 그래도 COM을 작성하는 사람은 이 구문을 이해하고 수정할수 있어야 한다.
 
Visual C++은 여기까지만 제공할뿐 그 이후는 다 수동이기 떄문이다.
 
이 함수를 수정하거나, 지운다거나 할때는 여러 부분을 수정해야 한다.
 
이 부분은 중요하다.
 
처음 ATL로 프로젝트를 하는 사람들이 애를 먹는 부분중에 하나이다.
책에 없기 떄문이다.
 
수정해야 할곳은 ....
 
일단 IDL을 수정해주고, 이를 구현한 관련 클래스의 함수들을 수정해 주어야 한다.
 
그리고, 안됄때는 IDL을 재 컴파일 해야 한다.
 
시간이 없는 관계로 다음에 계속....
 
반응형

+ Recent posts