2008. 6. 21. 01:47

IDL 파일, TypeLibrary, 그리고 Automation

Automation(자동화)으로 생성하지 않았던 Project에 자동화 기능을 추가함에 있어
몇가지 알아야할 사항이 있다.

-------------------------------------------------------------------------------
[ uuid(E4029F3C-B8DE-45A0-A190-2C5A8B240487), version(1.0) ]
library TypeLibTest
{
 importlib("stdole32.tlb");
 importlib("stdole2.tlb");

 //  CTypeLibTestDoc의 기본 디스패치 인터페이스
 
 [ uuid(DBF2D3CB-9991-4D7F-954C-2DDF53B597DF) ]
 dispinterface ITypeLibTest
 {
  properties:
   
  methods:
  [id(1), helpstring("메서드 Test")] LONG Test(LONG lTemp, LONG* lpTemp);
 };

 //  CTypeLibTestDoc의 클래스 정보
 
 [ uuid(41BB86A1-7049-4C43-92DC-07C3E5629C6C) ]
 coclass CTypeLibTestDoc
 {
  [default] dispinterface ITypeLibTest;
 };
};
-------------------------------------------------------------------------------

위 기본적인 IDL 파일에는 세가지 uuid가 있다.

TypeLibrary ID : 타입라이브러리 아이디로 CWinApp를 상속하는 클래스에서 InitInstance 부분에서
등록된다.

DispInterface ID : Coclass로 정의된 CTypeLibTestDoc의 인터페이스를 정의하는 ID로 CTypeLibTestDoc
내에서 Interface로 정의된다. 이 dispinterface에 정의된 메쏘드 및 속성은 Coclass에서 정의되어야 한다.
(IDL 파일에 정의하지 않고, Coclass에만 정의해도 되는 듯 하나 나중에 코드 관리가 어려워진다.)

그리고 마지막 coclassID : Inteface ID와 연결된 Coclass의 uuid로 TypeLibrary와 마찬가지로
CWinApp를 상속하는 클래스의 InitIntance 부분에서 등록된다.

이러한 TypeLibrary 를 기존 Project에 추가하기 위해서는 몇가지 추가작업이 더 필요하다.

그 중에서,

resource를 직접 편집하여 TypeLibrary를 등록하는 부분이 필요하다.

그리고

프로젝트 속성에서 Post-Build Event에서 $(TargetPath) /register를 등록하면
컴파일시 등록까지 할 수 있도록 설정할 수 있다.

이에 대한 좀더 자세한 내용은 CodeGuru에서 퍼온 다른 글을 참고하기 바람.

( Adding automation to MFC applications )