IRunningObjectTable::Register在注册类obj时抛出E\u INVALIDARG

2024-09-25 06:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个COM类对象注册到运行对象表(ROT)中,该对象表示我要自动化的应用程序。但是,返回的HRESULT是E_INVALIDARG,尽管提供的所有参数都匹配documented类型。你知道吗

应用程序类型是EXE,它在Windows注册表中用CLSID注册,其类型是LocalServer。你知道吗

我尝试的原因与一个类似的问题question有关。你知道吗

我通常使用python的comtypes包与一些应用程序连接,大多数应用程序通过调用GetActiveObject()成功。然而,当用这个应用程序的CLSID调用GetActiveObject()时,我得到了一个错误

WindowsError: [Error -2147221021] Operation unavailable

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对象,以便从GetActiveObject获得成功的结果。你知道吗

任何帮助和洞察都将受到真诚的感谢。你知道吗


Tags: the对象app应用程序类型ifnullsucceeded