2011-03-01 9 views
7

C++과 ATL로 작성된 두 개의 COM 개체가 있습니다. 도서관에는 IID와 CLID가 있습니다.ROT (Running Object Table)를 사용하여 두 COM 개체간에 통신하는 방법은 무엇입니까?

두 가지 간단한 COM 개체간에이 간단한 통신을 수행하는 예제를 찾을 수 없습니다. IMoniker를 만드는 방법과 ROT에 그것을 추가하는 방법? 그런 다음 다른 COM/프로세스에서이 COM 개체의 포인터를 검색하는 방법은 무엇입니까?

누구든지 작은 예제를 제공 할 수 있습니까?

편집 : 추가 정보 :

내가 애드온 IE 용을 쓰고 있어요. IE와는 전혀 다른 두 가지 COM 객체가 있습니다. 하나는 BHO (Browser Helper Obect)이고, 다른 하나는 비동기식 Pluggable Protocol (APP)입니다. ROT here을 통해 통신 할 수 있음을 발견했습니다.

+0

왜이 경우 ROT를 사용 하시겠습니까? – sharptooth

+0

@sharptooth IE 용 애드온을 작성 중입니다. 내 질문을 업데이트했습니다. –

+0

글쎄, 알 겠어. IMoniker 인터페이스를 구현하는 방법을 검색해야합니다. – sharptooth

답변

6

CreatePointerMoniker 대신 CreateItemMoniker을 사용해보세요. ROT에서 개체의 이름을 지정할 수 있습니다.

당신은이 같은 개체를 등록 할 수 있어야한다 : 당신이 당신의 객체가 자동으로 살해 그것에 더 이상 참조가 없을 때이 될하지 않으려면

DWORD RegisterInROT(LPCWSTR szObjName, IUnknown* pObj) 
{ 
    DWORD dwCookie = 0; 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
    { 
    CComPtr<IMoniker> pMoniker; 
    if (CreateItemMoniker(NULL, szObjName, &pMoniker) == S_OK) 
     if (pROT->Register(0, pObj, pMoniker, &dwCookie) == S_OK) 
      return dwCookie; 
    } 
    return 0; 
} 

, 당신이 대신 ROTFLAGS_REGISTRATIONKEEPSALIVE를 지정할 수 있습니다 0 (check in in MSDN). 이 과정의 목적을 등록하는 데 사용이 (같은 이름을 사용해야 같은

void RevokeFromROT(DWORD dwCookie) 
{ 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
     pROT->Revoke(dwCookie); 
} 

당신은 ROT에서 개체를 얻을 수 있습니다 : 함수 반환은 명시 적으로 나중에이 같은 ROT에서 개체를 제거하는 데 사용할 수있는 쿠키로 =)

void GetObjectFromROT(LPCWSTR szObjName, IUnknown** pObj) 
{ 
    CComPtr<IRunningObjectTable> pROT; 
    if (GetRunningObjectTable(0, &pROT) == S_OK) 
    { 
    CComPtr<IMoniker> pMoniker; 
    if (CreateItemMoniker(NULL, szObjName, &pMoniker) == S_OK) 
     pROT->GetObject(pMoniker, pObj); 
    } 
}