我正在使用 CoCreateInstance 函数创建与指定 CLSID 关联的类的单个对象。它返回 E_NOINTERFACE。
我检查了注册表,CLSID 是正确的。被调用对象dll的路径在注册表中是正确的,ThreadingModel是Apartment。此外,对接口(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/