Есть приложение, мне надо к нему подключиться с помощью 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)); }
|
Что я делаю не так? Спасибо.
|