确认注册的 COM 对象 CoCreateInstance 返回 REGDB_E_CLASSNOTREG

Posted

技术标签:

【中文标题】确认注册的 COM 对象 CoCreateInstance 返回 REGDB_E_CLASSNOTREG【英文标题】:Confirmed Registered COM Object CoCreateInstance returning REGDB_E_CLASSNOTREG 【发布时间】:2015-07-15 18:42:18 【问题描述】:

我有一个 ATL DLL,我试图从 ATL Exe 中使用它。当我尝试在 DLL 中创建对象的实例时,它失败并出现错误 REGDB_E_CLASSNOTREG。我检查了注册表,可以看到对象已注册,包括 ProgID 和 CLSID。

CComPtr<IMyInterface> ptrMyInterface;
ptrMyInterface.CoCreateInstance(L"ProgID", nullptr, CLSCTX_ALL); // Fails

CLSID myClsid;
CLSIDFromString(L"MyCLSID"), &myClsid);  // Correctly looks up the CLSID
ptrMyInterface.CoCreateInstance(myClsid, nullptr, CLSCTX_ALL); // Also fails

任何建议

【问题讨论】:

使用 SysInternals 的进程监视器来监视您的程序搜索注册表项。 在我的例子中,我没有为 COM 接口类添加 rgs 文件。 【参考方案1】:

好吧,我觉得有点傻。问题是 CComPtr 试图在我正在共同创建的对象上调用 QueryInterface。我正在使用的接口不是由我正在创建的类实现的。似乎会有比 REGDB_E_CLASSNOTREG 更好的错误。恕我直言,E_NOINTERFACE 之类的返回码会更好。

CComPtr<IMyCorrectInterface> ptrMyInterface;
ptrMyInterface.CoCreateInstance(L"ProgID", nullptr, CLSCTX_ALL); // WORKS!!!

【讨论】:

以上是关于确认注册的 COM 对象 CoCreateInstance 返回 REGDB_E_CLASSNOTREG的主要内容,如果未能解决你的问题,请参考以下文章

wps2013中,图表设置时,跳出窗口为“无法创建对象,请确认对象已在系统注册表中注册”。管理员怎么登陆

WPS显示无法创建对象,请确认对象已在系统注册表中注册

WPS里面进行公式编辑时出现无法创建对象,请确认对象已在系统注册表里注册 怎么办

WPS里面进行公式编辑时出现无法创建对象,请确认对象已在系统注册表里注册 怎么办

WPS之前正用着,现在公式编译器打不开,而且提示无法创建对象,请确认对象已经在系统注册表中注册。

WPS中插入对象auto CAD时为啥一直显示“无法创建对象,请确认对象已在系统注册表中注册”?