VB6组件上的QueryInterface仅在调试器中返回E_NOINTERFACE

时间:2011-11-23 15:23:08

标签: c++ com vb6

我有一个由VB6 COM对象实现的接口(ITask)。我有一个使用该接口的C ++ COM对象,它通常可以正常工作。

但是,当我运行VB6调试器来调试VB6 COM对象时,我的C ++对象突然在它调用ITask接口的VB6对象上的QueryInterface时返回E_NOINTERFACE。

界面定义:

[
    object,
    uuid(XXXX),
    pointer_default(unique),
    oleautomation
]

interface ITask : IUnknown
{
        [id(1)] HRESULT CreateTask([in, string] BSTR taskName);
}

C ++代码: hResult = pDisp->QueryInterface(IID_ITask, (void **) &m_pTaskApp);

pDisp是我通过调用管理对象生存期的不同组件获得的VB6 COM对象的IDispatch *

当VB6 COM对象运行调试器时,对IID_IDispatch的QueryInterface调用会成功。

有什么想法吗?

编辑 - 添加VB6代码:

Implements ITask

Private Sub ITask_CreateTask(ByVal taskName as String)
    ' do stuff
End Sub

1 个答案:

答案 0 :(得分:1)

您的描述表明您的VB6组件确实包含您的类(CLSID),但在调试时您没有获得与编译版本实现相同接口的组件。

这可能是由于VB6 COM组件中的兼容性设置所致。您可以在项目属性 - > VB6中的组件中更改它们。

默认设置为“项目兼容性”。选择此选项时,组件的每个新版本将使用相同的类ID(CLSID),但会获得新的接口ID。即使您的所有公共函数和属性与先前版本中的相同,也会发生这种情况。请注意,在编译项目和在调试模式下重新启动项目时都会发生这种情况。 有关兼容模式的说明,请参阅http://support.microsoft.com/kb/161137

要解决您的问题,请将兼容模式设置为二进制兼容性。

相关问题