반응형

이전에 얘기했던 IDL구문을 살펴보면 아주 아주 기본적인 IDL문법을 사용할수 있다.


이번에 설명할 것들은 IDL 구문을 조금더 풍성하게 해주는 것들이다.


다음은 필자가 몇전전에 개발했던 프로젝트에서 사용했던 IDL 코드의 일부이다.


이부분은 CONTROL MODE라는 타입을 정의하는 부분이며,


 //OCX모드에 대한 enum
 [
  uuid(C36DA983-03B1-4658-9874-10880B70CA93),v1_enum,
  helpstring("Control Mode Setting")
 ]
 typedef enum CONTROLMODE
 {
  MODE_INPUT =0,
  MODE_OUTPUT =1

 } CONTROLMODE;


이부분은 그 TYPE을 이용해서 만든 Property이다.

  [propget, id(37), helpstring("property Mode")] HRESULT Mode([out, retval] CONTROLMODE *pVal);


COM계열의 Object를 VB,VC++등의 IDE환경에서 사용해본 개발자라면 Object명.속성 = 까지

텍스트 창에 입력하였을때 그 뒤에 속성들의 리스트가 나오는 것을 보았을것이다.


예를들면

dim bA as boolean

이라고 해놓고...

bA = 까지 입력하면 뒤에 true와 false중 하나를 고르라는 IDE의 Intelligent기능을 볼수 있다.


위의 코드대로 작성한 ATL오브젝트의 경우

위와같은 상황에서 MODE_INPUT과 MODE_OUTPUT중 하나를 고르라는 Intelligent기능을

볼수 있다.


이 기능은 의외로 자주 사용되는 기능이다.

ATL로 만들어진 COM오브젝트들언 어짜피 다른 개발자들을 위한것...

이 기능을 제공해주면, 사용하는 입장에선 매우 편리하다.


이제 코드 하나하나를 살펴보자.


uuid는 GUID이다. 이는 역시 guidgen.exe를 통해서 생성한후 붙여넣으면 된다.

v1_enum이라는건 무조건 써주어야 한다고 생각해두자.

COM은 이전에 설명했듯이 역사상 OLE, DDE등의 MS의 핵샘 기술들의 연속선상에 있다.

그런 이유로 IDL에서 enumulation은 default로 16bit형식으로 잡혀있다.

v1_enum을 써줌으로써, 이 COM오브젝트를 32bit형식으로 사용한다고 말해주는 것이다.

현재의 컴퓨팅 환경에서는 32bit를 주로 사용하게 되므로 v1_enum을 써주는 것이 좋다.

결과적으로, v1_enum을 써주는 것은 COM의 Marshaling 성능에 영향을 준다.

다른 프로세스와도 통신할수 있는 COM에 있어서 32bit가 기본인 다른 소프트웨어와의 통신에서

변환과정을 거치지 않는 만큼 성능의 향상을 가져올수 있기 때문이다.

반응형

+ Recent posts