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

QueryInterface on a VB6 component returns E_NOINTERFACE in debugger only

本文关键字:返回 NOINTERFACE 调试器 组件 QueryInterface VB6      更新时间:2023-10-16

我有一个由vb6com对象实现的接口(ITask)。我有一个使用接口的c++ COM对象,它通常工作得很好。

然而,当我运行VB6调试器来调试VB6 COM对象时,我的c++对象在调用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

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

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

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

要解决这个问题,请将兼容模式设置为二进制兼容