интерфейсы нескольких экземпляров одного приложения
От: VolaND_666  
Дата: 08.09.05 06:55
Оценка:
Здравствуйте уважаемые.
Возник следующий вопрос:
Есть приложение в dll которого реализован COM.
При загрузке приложения создается экземпляр этого самого COM.
Как известно при загрузке нескольких экземпляров одного приложения
обращаться можно только к одному (активному , GetActiveObject) интерфейсу (обычно это интерфейс первого загруженного приложения).
Вопрос: Можно ли каким — нибудь способом получить интерфейсы каждого
загруженного экземпляра приложения ?
Re: интерфейсы нескольких экземпляров одного приложения
От: VolaND_666  
Дата: 08.09.05 13:05
Оценка:
Вот решение


IRunningObjectTable* pTable = NULL; 
    GetRunningObjectTable(0, &pTable);
    if(pTable)
    {
        IEnumMoniker* pEnum = NULL;
        pTable->EnumRunning(&pEnum);
        if(pEnum)
        {
            HRESULT hRes = S_OK;
            pEnum->Reset();
            
            while(hRes == S_OK)
            {
                ULONG iFetch;
                IMoniker* pMoniker = NULL;
                hRes = pEnum->Next(1, &pMoniker, &iFetch);
                if(hRes == S_OK) 
                {
                    if(pMoniker)
                    {                        
                        IUnknown* pUnk = NULL;
                        pTable->GetObject(pMoniker, &pUnk);
                        if(pUnk)
                        {
                            ITDMSApplication* ppTDMSApp;
                            
                            pUnk->QueryInterface(IID_ITDMSApplication, (void**)&ppTDMSApp);
                            if(ppTDMSApp)
                            {
                                ppTDMSApp->Release();
                            }
                            pUnk->Release();
                        }
                        pMoniker->Release();
                    }
                }
            }
        }

        pTable->Release();
    }
Re[2]: интерфейсы нескольких экземпляров одного приложения
От: Vi2 Удмуртия http://www.adem.ru
Дата: 08.09.05 14:20
Оценка:
Здравствуйте, VolaND_666, Вы писали:

VND>Вот решение


Увы, это не решение. Потому что, невзирая на правильный перебор по количеству моникеров,

VND>        IUnknown* pUnk = NULL;
VND>        pTable->GetObject(pMoniker, &pUnk);

GetObject вернет один и тот же объект. Потому что моникер будет один и тот же (или такой же, что эквивалентно).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.