我正在尝试向运行对象表(ROT)注册一个COM类对象,该对象代表我要自动化的应用程序。但是,尽管提供的所有参数都与documented类型匹配,但返回的HRESULT是E_INVALIDARG
。
应用程序类型为EXE,并在Windows注册表中使用CLSID注册,其类型为LocalServer。
我尝试的原因与一个类似的问题question有关。
我通常使用python的comtypes包来连接某些应用程序,其中大多数通过调用GetActiveObject()
成功。但是,使用此应用程序的CLSID调用GetActiveObject()
时出现错误
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
获得成功的结果。
我们将不胜感激任何帮助和见解。