Winapi CComPtr CoCreateInstance()失败

Winapi CComPtr CoCreateInstance()失败,winapi,com,Winapi,Com,我有一个COM.dll已成功注册到regsvr32,但不知何故CoCreateInstance()未能创建它的一个接口。是否有一个免费工具可以确定失败的原因?首先,检查CoCreateInstance()调用的返回值。其次,您可以使用诸如Regmon或processmonitor之类的工具来查看哪些注册表查找失败。通过这种方式,您可以快速确定哪些内容没有按预期的方式注册 > P>如果COMDLL在C++中实现,并且具有调试信息,则可以尝试用MSVC调试进入COCCREATEATION实例。 我的

我有一个COM
.dll
已成功注册到
regsvr32
,但不知何故
CoCreateInstance()
未能创建它的一个接口。是否有一个免费工具可以确定失败的原因?

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

> P>如果COMDLL在C++中实现,并且具有调试信息,则可以尝试用MSVC调试进入COCCREATEATION实例。 我的猜测是您没有正确地将类与其中一个接口相关联。我犯了好几次错误。如果您正在使用ATL,您需要确保您的实现类派生自接口,并且您已经在COM映射中为您的接口添加了
COM\u interface\u条目(I\u\u)

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++文件中的内容不同。MSVC6有一个恼人的错误,如果向导由于文件权限(例如,它想要更改的某些文件是只读的)而无法创建新类,但它已经向IDL文件添加了GUID,并且您修复了文件权限并再次执行,那么GUI中会出现不一致,因此很难发现这一点。在理想情况下,GUID定义将只驻留在一个文件中,这样您就不必担心这个问题

如果不是这样,有时会出现关于封送和单元的奇怪错误,但只有当您有多个线程并且正在跨线程或接口边界发送接口指针时,才会出现这种错误