【问题标题】:QueryInterface on a VB6 component returns E_NOINTERFACE in debugger onlyVB6 组件上的 QueryInterface 仅在调试器中返回 E_NOINTERFACE
【发布时间】:2012-01-04 21:22:23
【问题描述】:

我有一个由 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

【问题讨论】:

  • 这是您正在实例化的 VB6 中的类还是用户控件?

标签: c++ com vb6


【解决方案1】:

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

这可能是由于您在 VB6 COM 组件中的兼容性设置。您可以在 VB6 中的 Project Properties->Component 中更改它们。

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

要解决您的问题,请将兼容模式设置为 Binary Compatibility。

【讨论】:

  • 这没有帮助。为了清楚起见,该接口是用 C++ 定义的(从技术上讲,是 MIDL),并在 VB6 对象引用的 TLB 中导出。我想知道它是否与进程内与进程外 COM 有关。我对 VB6 调试器的理解是它将 COM 对象托管在进程之外,而不是附加到进程(当您正在调试 DLL 时)。
  • @MikeSackton 是的,这是正确的。当您启动 VB6 调试器时,COM 对象驻留在 VB6.exe 进程中,而不是附加到另一个进程。您的 VB6 代码是什么样的?你在使用 Implements YourTLB.ITask 吗?
猜你喜欢
  • 2021-08-22
  • 2021-08-17
  • 1970-01-01
  • 2012-01-15
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多