Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > COM и несколько экземпляров приложения


Автор: Qwe2 28.9.2012, 15:09
Есть приложение, мне надо к нему подключиться с помощью COM-технологии и работать с ним (использую WinAPI и MSVC2010). Я знаю его CLSID (получаю с помощью CLSIDFromProgID(<название>)). Когда запускаю это приложение, в таблице запущенных объектов (Running Object Table, ROT) появляется значение, совпадающее с CLSID. Если запущено несколько приложений, то в ROT будет столько же одинаковых записей = CLSID. Когда я в цикле перебираю значения ROT и при совпадении с CLSID приложения пытаюсь подключиться, то всегда подключаюсь к первому из запущенных приложений:
Код

IRunningObjectTable *prot = NULL;
IEnumMoniker *pEnum = NULL;
IMoniker * pMoniker = NULL;
ULONG cElt;
IUnknown* pUnk = NULL;

IBindCtx *pBindCtx;
CreateBindCtx(0, &pBindCtx);

GetRunningObjectTable(0, &prot);
prot->EnumRunning(&pEnum);
while(pEnum->Next(1, &pMoniker, &cElt) == S_OK)
{
    CreateBindCtx(0, &pBindCtx);
    pMoniker->GetDisplayName(pBindCtx, NULL, &pszName);
    ...

    if(<текущее значение ROT = CLSID>)
    {
        prot->GetObjectA(pMoniker, &pUnk);
    }
}
<...>

Если использовать BindToObject, то происходит ошибка E_INVALIDARG:
Код

if(...)
{
    hr = pMoniker->BindToObject(pBindCtx, 0, IID_IUnknown, reinterpret_cast<void**>(&pUnk));
}

Что я делаю не так? Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)