2011-03-01 13 views
7

C++ ve ATL'de yazılmış iki COM nesnesine sahibim. Bir kütüphanede var ve onların IID'lerini ve CLID'lerini biliyorum.Çalışan Nesne Tablosunu (ROT) kullanarak iki COM nesnesi arasında nasıl iletişim kurabilirim?

İki basit COM nesnesi arasında bu basit iletişimi gerçekleştirmenin bir örneğini bulamıyorum. IMoniker nasıl oluşturulur ve ROT'ye nasıl eklenir? Ve sonra, bu nesnenin işaretçisini farklı işlem/iş parçacığında diğer COM'larda nasıl alırsınız?

Herkes küçük bir örnek sağlayabilir mi?

DÜZENLEME: Daha çok bilgi:

Ben bir eklentiyi IE için yazıyorum. IE'nin farklı amaçlarla yüklediği iki COM nesnesi vardır. Biri BHO (Tarayıcı Yardımcı Algılayıcısı), diğeri ise Eşzamansız Takılabilir Protokolü (APP) ROT here üzerinden iletişim kurabildiğimi buldum.

+0

Bu durumda neden ROT kullanmak istersiniz? – sharptooth

+0

@sharptooth IE için eklenti yazıyorum. Sorumu güncelledim. –

+0

Eh, anlıyorum. IMoniker arayüzünü nasıl uygulayacağınızı araştırmalısınız. – sharptooth

cevap

6

CreatePointerMoniker yerine CreateItemMoniker kullanmayı deneyin - ROT'teki nesneniz için bir ad belirtmenize izin verir.

Böyle Nesnenizi kayıt gerekir: Eğer nesne otomatik öldürülmüş buna artık referanslar varken olmak istemiyorsanız

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

, sen yerine ROTFLAGS_REGISTRATIONKEEPSALIVE belirtebilirsiniz 0 (check in in MSDN). elbette nesneyi kaydetmek için kullanılan bu (aynı ismini kullanması gerektiği gibi

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

Sen ROT nesneyi alabilirsiniz: fonksiyon döner açıkça sonradan böyle ROT adresinin nesneyi kaldırmak için kullanabileceğiniz çerez =)

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); 
    } 
} 
İlgili konular