我有一个COM .dll
已成功注册regsvr32
但不知何故CoCreateInstance()
无法创建其中一个接口。是否有免费软件工具可以确定失败的原因?
答案 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定义只驻留在一个文件中,然后您就不必担心这个。
如果不是这样,有时会出现关于编组的奇怪错误。如果您有多个线程并且正在跨线程或接口边界发送接口指针,那么只会弹出公寓。