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

标签 c++ com vb6

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

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

接口(interface)定义:

[
    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),但是在调试时您没有获得实现与编译版本相同接口(interface)的组件。

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

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

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

关于c++ - VB6 组件上的 QueryInterface 仅在调试器中返回 E_NOINTERFACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8244654/

相关文章:

c++ - SQLite - 预分配数据库大小

c++ - 如何最好地将 VARIANT_BOOL 转换为 C++ bool?

vba - 使用 VTable hacking 使用标准模块中的方法重载 COM 类方法

vb6:如何单击另一个正在运行的进程上的按钮?

c++ - 如何让月份停止显示 1.00、2.00 等

c++ - 如何将 CTreeCtrl 项目滚动到中心

c++ - Eigen log 和 exp 函数类型转换错误

c# - 异步/等待、ThreadPool 和 SetApartmentState

excel - 通过打开文件启动 Excel 时,不加载 Excel 的 COM 加载项

html - 为具有 -ve 文本缩进的段落应用背景颜色