2011-03-01 6 views
7

Tengo dos objetos COM escritos en C++ y ATL. Hay en una biblioteca y sé sus IID y CLID.¿Cómo comunicarse entre dos objetos COM utilizando Running Object Table (ROT)?

No encuentro un ejemplo de cómo hacer esta simple comunicación entre dos objetos COM simples. ¿Cómo crear IMoniker y cómo agregarlo a ROT? Y luego, ¿cómo recuperar el puntero de este objeto, en otro COM en diferentes procesos/subprocesos?

¿Alguien puede dar un pequeño ejemplo?

EDITAR: Más información:

Estoy escribiendo un add-on para Internet Explorer. Hay dos objetos COM completamente independientes de la carga de IE para diferentes propósitos. Una es BHO (Browser Helper Obect), otra es Asinnchronous Pluggable Protocol (APP). Descubrí que puedo comunicarme a través de ROT here.

+0

¿Por qué querría usar ROT en este caso? – sharptooth

+0

@sharptooth Estoy escribiendo add-on para IE. Actualicé mi pregunta –

+0

Bueno, ya veo. Tienes que buscar cómo implementar la interfaz IMoniker. – sharptooth

Respuesta

6

Pruebe usar CreateItemMoniker en lugar de CreatePointerMoniker - le permite especificar un nombre para su objeto en ROT.

Usted debe ser capaz de registrar su objeto como éste:

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; 
} 

Si no desea que el objeto sea auto-muertos cuando no hay más referencias a él, se podría especificar en lugar de ROTFLAGS_REGISTRATIONKEEPSALIVE 0 (check in in MSDN). Los rendimientos función de cookies se pueden utilizar para eliminar de forma explícita su objeto desde ROT tarde como esto:

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

usted puede conseguir el objeto de la podredumbre como esta (que debe utilizar el mismo nombre que utilizó para registrar el objeto, por supuesto, =)

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); 
    } 
} 
Cuestiones relacionadas