프로그래밍2007.07.22 16:06
인터페이스가 많아지면 규모성의 문제가 생김 -> 특정 인터페이스들을 지원하는 컴포넌트를 카테고리 별로 분류
클라이언트 프로그램은 레지르스트리를 빠르게 검색하여 특정 카테고리를 지원하는 컴포넌트를 구별하여 인스턴스화 함

카테고리 구별자 CATID
HKEY_CLASSES_ROOT > Component Categories
HKEY_CLASSES_ROOT > CLSID

컴포넌트 객체는 Implemented Categories 레지스트리 키를 사용하여 자신이 지원하는 컴포넌트 카테고리들을 알린다.

컴포넌트 객체는 Required Categories 레지스트리 키를 사용하여 자신이 받아들일 수 있는 클라이언트의 카테고리를 알린다.
( 객체에 접근할 수 있는 클라이언트를 매우 제한하여 버리기 때문에 조심해서 사용 )

카테고리의 기본 컴포넌트

TreatAs 레지스트리 키를 이용하여 카테고리의 기본 컴포넌트로 사용할 수 있다.
ToolBoxBitmap32 서브키를 이용하면 OLEViewer 에서 아이콘을 볼수 있다.

클래스 에뮬레이션

코클래스가 발전해나감에 따라 새로운 CLSID를 할당하여 사용하고자 한다면 기존의 CLSID에서 에뮬레이션하여 새로운 CLSID로 연결할 수 있다.
CoTreatAsClass, CoGetTreatAsClass 함수로 에뮬레이션을 설정하거나, 설정된 에뮬레이션 클래스를 가져온다.
이역시 TreatAs 레지스트리 키를 이용 한다.

카테고리 등록
ICatRegister 인터페이스 이용
ComponentCategoryManager를 이용하여 카테고리를 관리한다.

#include // 컴포턴트 카테고리 지원

CATID_USER = {....{ ... }} // UUID

ICatRegister * pCatRegister;
CoCreateInstance(CLSID_StdComponentCategoriesMgr,Null, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void)**&pCatRegister);

CATEGORYINFO catinfo;
catinfo.catid = CATID_USER;
wcsncpy(catinfo.szDescripction, L"사용자",128);

// 등록
pCatRegister->RegisterCategories(1, &catinfo);

// 등록해제
pCatRegister->UnRegisterCategories(1, &CATID_USER);

// 등록, 해제할 컴포넌트 카테고리들
CATID rgcatid[3];
rgcatid[0] = CATID_USER;
rgcatid[1] = CATID_......
rgcatid[2] = CATID_......

// 컴포넌트 카테고리들에 컴포넌트 객체 등록
pCatRegister->RegisterClassImplCategories(CLSID_UserCOM, 3 , rgcatid);
// 컴포넌트 카테고리들에 컴포넌트 객체 해제
pCatRegister->UnRegisterClassImplCategories(CLSID_UserCOM, 3 , rgcatid);

pCatRegister->Release();

카테고리 정보 얻기
ICatInformation 인터페이스 이용
ComponentCategoryManager를 이용하여 카테고리를 관리한다.

ICatInformation * pCatInformation;
CoCreateInstance(CLSID_StdComponentCategoriesMgr,Null, CLSCTX_INPROC_SERVER, IID_ICatInformation, (void)**&pCatInformation);

IEnumCLSID * pEnumCLSID;
pCatInformation->EnumClassesOfCategories(1, &CATID_USER, 0, NULL, &pEnumCLSID);

pCatInformation->Release();

액티브X 컨트롤은 자동으로 ActiveX의 컴포넌트 카테고리로 등록이 된다.

MSDN : http://msdn2.microsoft.com/en-us/library/ms692689.aspx
Posted by 꿍스