Здравствуйте уважаемые.
Возник следующий вопрос:
Есть приложение в dll которого реализован COM.
При загрузке приложения создается экземпляр этого самого COM.
Как известно при загрузке нескольких экземпляров одного приложения
обращаться можно только к одному (активному , GetActiveObject) интерфейсу (обычно это интерфейс первого загруженного приложения).
Вопрос: Можно ли каким — нибудь способом получить интерфейсы каждого
загруженного экземпляра приложения ?
Вот решение
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();
}
Здравствуйте, VolaND_666, Вы писали:
VND>Вот решение
Увы, это не решение. Потому что, невзирая на правильный перебор по количеству моникеров,
VND> IUnknown* pUnk = NULL;
VND> pTable->GetObject(pMoniker, &pUnk);
GetObject вернет один и тот же объект. Потому что моникер будет один и тот же (или такой же, что эквивалентно).