c++ - CoCreateInstance 在一台 PC 中返回 E_NOINTERFACE

标签 c++ com

我正在使用 CoCreateInstance 函数创建与指定 CLSID 关联的类的单个对象。它返回 E_NOINTERFACE。

我检查了注册表,CLSID 是正确的。被调用对象dll的路径在注册表中是正确的,ThreadingModelApartment。此外,对接口(interface)标识符的引用是正确的。

新创建的对象上下文参数是CLSCTX_INPROC_SERVER

虽然此函数调用在一台 PC 上有效,但在另一台 PC 上无效。我尝试再次使用regsvr32注册dll,但仍未解决问题。

问题的原因可能是什么?

最佳答案

最可能的原因 — 32/64 位不兼容,即您试图在 64 位应用程序中创建 32 位进程内 COM 对象,反之亦然。请注意,regsvr32 也是平台相关的,在 Win64 上,C:\Windows\SysWOW64\regsvr32.exe 中还有一个用于在 64 位 Windows 上注册 32 位 COM 服务器。

另一个可能的原因——不兼容的线程模型。 Read this for explanation .

更新:另一个可能的原因是对象内部可能使用了其他一些 COM 对象,并且该依赖的 COM 对象未注册,或者版本错误。 在出现故障的 PC 上使用 SysInternals Process Monitor 查看您的客户端应用程序在 CreateInstance 因 E_NOINTERFACE 失败之前立即尝试打开哪些文件/注册表项。 和/或在它工作的 PC 上使用 Process Explorer,并查看作为 CreateInstance 调用的结果加载了哪些 DLL。

关于c++ - CoCreateInstance 在一台 PC 中返回 E_NOINTERFACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171460/

相关文章:

C++ 组合 2 个数组,数据有序

c++ - 是否可以更改从 GetTickCount() 返回的刻度计数值?

c# - 使用 tlbimp 不需要第二次组装?

c# - 创建 RDP 连接时出现转换错误

c++ - 如何找出发生浮点异常的位置?

c++ 内存泄漏 - boost 库

c++ - 如何将返回 C++ 自定义类的函数与 Cython 连接?

com - 使用 RDP 控件登录需要网络级身份验证的 Vista 计算机

c++ - 如何在 Internet Explorer COM 对象中应用 css?

.net - .NET 中是否有与 DCOM 相对应的可行方案?