【发布时间】:2010-09-24 18:00:43
【问题描述】:
我有一个 COM .dll 成功注册到 regsvr32 但不知何故 CoCreateInstance() 无法创建其接口之一。是否有可以确定失败原因的免费软件工具?
【问题讨论】:
我有一个 COM .dll 成功注册到 regsvr32 但不知何故 CoCreateInstance() 无法创建其接口之一。是否有可以确定失败原因的免费软件工具?
【问题讨论】:
首先,检查 CoCreateInstance() 调用的返回值。其次,您可以使用 Regmon 或 Process Monitor 之类的工具来查看哪些注册表查找失败。通过这种方式,您可以快速确定哪些内容没有按照您期望的方式注册。
【讨论】:
如果您的 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 定义将仅驻留在一个文件中,您不必担心这一点。
如果不是这样,有时会出现关于编组和套间的奇怪错误,但只有当您有多个线程并且跨线程或接口边界发送接口指针时才会弹出。
【讨论】: