Python IRunningObjectTable::Register在注册类对象时抛出E_INVALIDARG

Python IRunningObjectTable::Register在注册类对象时抛出E_INVALIDARG,python,c++,mfc,com,comtypes,Python,C++,Mfc,Com,Comtypes,我正在尝试将一个COM类对象注册到运行对象表(ROT)中,该对象表示我要自动化的应用程序。但是,返回的HRESULT是E_INVALIDARG,尽管提供的所有参数都与类型匹配 应用程序类型为EXE,在Windows注册表中使用CLSID注册,其类型为LocalServer 我尝试的原因与一个类似的问题有关 我通常使用python包与一些应用程序连接,其中大多数都通过调用GetActiveObject()成功。但是,当使用此应用程序的CLSID调用GetActiveObject()时,我得到一个错

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

应用程序类型为EXE,在Windows注册表中使用CLSID注册,其类型为LocalServer

我尝试的原因与一个类似的问题有关

我通常使用python包与一些应用程序连接,其中大多数都通过调用
GetActiveObject()
成功。但是,当使用此应用程序的CLSID调用
GetActiveObject()
时,我得到一个错误

WindowsError:[错误-2147221021]操作不可用

MFC应用程序代码的有效部分如下

CoInitialize(空);
IMoniker*appmnk;
CLSID appclsid;
IUnknown*app_ptr=NULL//在CoGetClassObject中,指向exe应用程序的指针
DWORD dwrdptr;
IRunningObjectTable*rot//使用GetRunningObjectTable获取指针
HRESULT-hr;
HRESULT-hr0;
HRESULT-hr1;
HRESULT-hr2;
HRESULT-hr3;
hr0=CLSIDFromProgID(OLESTR(“TheApp.Application.1”),&appclsid);
//“TheApp.Application.1”是一个假设的ProgID
//在实际代码中,它将替换为实际的ProgID
如果(成功(hr0))
{
hr1=CoGetClassObject(appclsid、CLSCTX_LOCAL_SERVER、NULL、IID_IUnknown、(void**)和app_ptr);
如果(成功(hr1))
{
hr2=CreateItemMoniker(L“!”、OLESTR(“myappmnk”)、&appmnk);
如果(成功(hr2))
{
hr3=GetRunningObjectTable(0,&rot);
如果(成功(hr3))
{
hr=rot->Register(ROTFLAGS\u REGISTRATIONKEEPSALIVE、app\u ptr、appmnk和dwrdptr);
rot->Release();
}
appmnk->Release();
}
app_ptr->Release();
}
}
coninitialize();
我寻求的最终结果是成功地将应用程序的COM对象注册为ROT,以便从
GetActiveObject
获得成功的结果


非常感谢您提供的任何帮助和见解。

您正在泄漏由
CoGetClassObject()
CreateItemMoniker()
GetRunningObjectTable()返回的所有COM对象。在调用
coninitialize()
之前,您需要对所有这些组件调用
Release()
。此外,
app_ptr
需要声明为
IUnknown*
并在传递到
CoGetClassObject()
时类型转换为
void**
,在传递到
Register()时不声明为
void*
并类型转换为
IUnknown*
并且在调用
Register()
@RemyLebeau之前,您没有做任何错误处理来确保
CLSIDFromProgID()
CoGetClassObject()
、CreateItemMoniker()和
GetRunningObjectTable()
都成功
对于每个成功的步骤。。将
app_ptr
的声明更改为
IUnknown*
,并在传递到
CoGetClassObject()
时将其键入到
void**
。。但是,同样的E_INVALIDARG错误也会出现。具体在哪一步?
寄存器()
?这是最后一步<代码>hr=rot->Register(ROTFLAGS\u registration keepsalive、app\u ptr、appmnk和dwrdptr)。。
hr
的值无效。您正在泄漏由
CoGetClassObject()
CreateItemMoniker()
GetRunningObjectTable()返回的所有COM对象。在调用
coninitialize()
之前,您需要对所有这些组件调用
Release()
。此外,
app_ptr
需要声明为
IUnknown*
并在传递到
CoGetClassObject()
时类型转换为
void**
,在传递到
Register()时不声明为
void*
并类型转换为
IUnknown*
并且在调用
Register()
@RemyLebeau之前,您没有做任何错误处理来确保
CLSIDFromProgID()
CoGetClassObject()
、CreateItemMoniker()和
GetRunningObjectTable()
都成功
对于每个成功的步骤。。将
app_ptr
的声明更改为
IUnknown*
,并在传递到
CoGetClassObject()
时将其键入到
void**
。。但是,同样的E_INVALIDARG错误也会出现。具体在哪一步?
寄存器()
?这是最后一步<代码>hr=rot->Register(ROTFLAGS\u registration keepsalive、app\u ptr、appmnk和dwrdptr)。。
hr
的值为E_INVALIDARG