본문 바로가기

프로그래밍

[COM] Moniker

각 타입별 이름 짓는 규칙을 표준화된 모니커 인터페이스를 통해서 지을 수 있도록 함

시스템 모니커 종류 : 이름 짓는 객체에 대해 추가의 정보 필요
파일 모니커 : CreateFileMoniker
아이템 모니커 : CreateItemMoniker
포인터 모니커 : CreatePointerMoniker
안티 모니커 : CreateAntiMoniker
복합 모니커 : CreateGenericComposite
클래스 모니커 : CreateClassMoniker
URL 모니커 : CreateURLMoniker
OBJREF 모니커 : CreateObjrefMoniker

커스텀 모니커
IMoniker 인터페이스 구현

IBindCtx ( 바인드 컨텍스트 )
모니커 바인딩 동작에 대한 정보를 가지고 있는 객체

IMoniker::BindToObject ( 바인드 컨텍스트 정보를 인자로 넘겨줌 )
BindMoniker 헬퍼 메소드 ( 바인드 컨텍스트 정보 넘겨주지 않음 )

IMoniker::GetDisplayName 모니커의 디스플레이 이름을 리턴
IMoniker::ParseDisplayName 디스플레이 이름으로 모니커 객체를 가져옴

MkParseDisplayname 함수
원하는 타입의 모니커 객체를 가져옴
IMoniker::ParseDisplayName과 유사하나 모니커가 필요없이 모니커를 가져옴
ProgID:ObjectName 형식의 문자열을 취함 ex : "clsid:{0000-0000{00-00}}"

CoGetClassObject 함수 : 디스플레이 이름의 모니커를 변환하고 이름지어진 객체로 바인딩하는 과정을 단순화 시킴

IClassActivator 인터페이스 : 클래스 모니커의 기본 동작을 가로채서 변경할 수 있도록 해줌.

IMoniker * pClassMoniker;
CreateClassMoniker( clsid , &pClassMoniker);

//////////////////////////////////////////////////////////////

// 바인드 컨텍스트 시작
IBindCtx * pBindCtx;
CreateBindCtx(0, &pBindCtx);

ULONG eaten;
IMoniker * pMoniker;
OLECHAR string[] = L"clsid:00000000-0000-0000-000000000000001";
MkParseDisplayName(pBindCtx, string, &eaten, &pMoniker);

// 모니커에서 클래스 팩토리를 바인딩 한다.
IClassFactory * pClassFactory;
pMoniker->BindToObject(pBindCtx, NULL, IID_IClassFactory, (void**)&pClassFactory);

// 클래스 팩토리로 COM객체를 생성한다.
IUser * pUser;
pClassFactory->CreateInstance(&pUser);

// 무엇을 한다
pUser->Some();

// 모든 것을 헤제한다.
pClassFactory->Release();
pUser->Release();
pBindCtx->Release();
pMoniker->Release();



ROT ( 동작 객체 테이블 )
객체들이 스스로 등록할 수 있는 컴퓨터 단위의 테이블
모니커를 객체에 바인딩 할때, ROT를 통해서 모니커는 객체가 이미 동작중인지를 확인할 수 있다. -> 불필요하게 새로운 인스턴스 생성X

GetRunningObject 함수를 통하여 IRunningObjectTable 인터페이스 를 얻어서 ROT에 등록 하고 해제한다.

// ROT의 모니커이름을 뿌려줌 ////////////////////////
/////////////////////////////////////////////////////////

IRunningObjectTable * pRunningObjectTable;
GetRunningObjectTable(NULL, &pRunningObjectTable);

IEnumMoniker * pEnumMoniker;
pRunningObjectTable->EnumRunning(&pEnumMoniker);

IMoniker * pMoniker;
IBindCtx * pBindCtx;
OLECHAR * moniker_name;

// 모든 모니커에 루프를 돔
while(pEnumMoniker->Next(1, &Moniker, NULL) == S_OK)
{
CreateBindCtx(0, &pBindCtx);

pMoniker->GetDisplayName(pBindCtx, NULL, &moniker_name);
wprintf(L"DisplayName is %s\n", moniker_name);
CoTaskMemFree(moniker_name);

pMoniker->Release();
pBindCtx->Release();
}

pEnumMoniker->Release();
pRunningObjectTable->Release();





MSDN : http://msdn2.microsoft.com/en-us/library/ms688618.aspx ( IMoniker-Class Moniker Implementation )