IRunningObjectTable :: Register генерирует E_INVALIDARG при регистрации объекта класса - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь зарегистрировать объект класса COM, представляющий приложение, которое я хочу автоматизировать, в таблице запущенных объектов (ROT). Однако возвращаемое значение HRESULT равно E_INVALIDARG, хотя все предоставленные аргументы соответствуют документированным типам.

Тип приложения - EXE, он зарегистрирован в реестре Windows с CLSID, а его тип - LocalServer.

Причина моей попытки связана с аналогичным вопросом .

Я обычно соединяюсь с некоторыми приложениями, использующими пакет python * comtypes *1013*, большинство из них успешно с вызовом GetActiveObject(). Однако при вызове GetActiveObject() с CLSID этого приложения я получаю ошибку

WindowsError: [Ошибка -2147221021] Операция недоступна

Действующей частью кода приложения MFC является следующая

CoInitialize(NULL);

IMoniker *appmnk;
CLSID appclsid;
IUnknown* app_ptr = NULL; //in CoGetClassObject, the pointer to the exe application

DWORD dwrdptr;

IRunningObjectTable *rot; //fetch the pointer using GetRunningObjectTable
HRESULT hr;
HRESULT hr0;
HRESULT hr1;
HRESULT hr2;
HRESULT hr3;

hr0 = CLSIDFromProgID(OLESTR("TheApp.Application.1"), &appclsid);
// "TheApp.Application.1" is a hypothetical ProgID
// In the actual code, it's replaced with the actual ProgID

if (SUCCEEDED(hr0))
{
    hr1 = CoGetClassObject(appclsid, CLSCTX_LOCAL_SERVER, NULL, IID_IUnknown, (void **)&app_ptr);
    if (SUCCEEDED(hr1))
    {
        hr2 = CreateItemMoniker(L"!", OLESTR("myappmnk"), &appmnk);
        if (SUCCEEDED(hr2))
        {
            hr3 = GetRunningObjectTable(0, &rot);
            if (SUCCEEDED(hr3))
            {
                hr = rot->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, app_ptr, appmnk, &dwrdptr);
                rot->Release();
            }
            appmnk->Release();
        }
        app_ptr->Release();
    }
}

CoUninitialize();

Конечный результат, который я ищу, - это успешно зарегистрировать COM-объект приложения в ROT, чтобы получить успешный результат от GetActiveObject.

Любая помощь и понимание будут по-настоящему оценены.

...