CComPtr CoCreateInstance()失败

时间:2008-12-01 12:57:44

标签: winapi com

我有一个COM .dll已成功注册regsvr32但不知何故CoCreateInstance()无法创建其中一个接口。是否有免费软件工具可以确定失败的原因?

2 个答案:

答案 0 :(得分:2)

首先,检查CoCreateInstance()调用的返回值。其次,您可以使用Regmon或Process Monitor之类的工具来查看注册表查找失败的原因。通过这种方式,您可以快速确定未按预期方式注册的内容。

答案 1 :(得分:0)

如果您的com dll是用C ++实现的,那么有调试信息,您也可以尝试使用MSVC调试进入CoCreateInstance。

我的猜测是你错过了将你的班级与其中一个界面正确联系起来。我错误地做了很多次。如果你正在使用ATL,你需要确保你的实现类来自接口&您还在COM_MAP中为您的界面添加了COM_INTERFACE_ENTRY(I____)

BEGIN_COM_MAP(CFileHelper)
    COM_INTERFACE_ENTRY(IFileHelper)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IStream)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

或者,IDL文件与实现C ++文件中的内容之间的GUID可能不同。 MSVC6有一个恼人的错误,如果向导因文件权限而无法创建新类(例如,它想要更改的某些文件是只读的),但它已经向IDL文件添加了一个GUID,并修复了文件权限再次去做,GUID会有一个不一致的地方,抓住这个很难。在理想的世界中,GUID定义只驻留在一个文件中,然后您就不必担心这个。

如果不是这样,有时会出现关于编组的奇怪错误。如果您有多个线程并且正在跨线程或接口边界发送接口指针,那么只会弹出公寓。