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

发布于 2024-12-18 01:59:59 字数 812 浏览 0 评论 0原文

我有一个由 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 的 IDispatch *我通过调用管理对象生命周期的不同组件获得的 COM 对象)

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

有什么想法吗?

编辑 - 添加 VB6 代码:

Implements ITask

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

I have an interface (ITask) that implemented by a VB6 COM object. I have a C++ COM object that uses the interface, and it generally works fine.

However, when I run the VB6 debugger to debug the VB6 COM object, my C++ object is all of a sudden getting E_NOINTERFACE returned when it calls QueryInterface on the VB6 object for the ITask interface.

Interface definition:

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

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

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

(pDisp is an IDispatch * to the VB6 COM object that I obtained through a call to a different component that manages object lifetimes)

A call to QueryInterface for IID_IDispatch succeeds when the VB6 COM object is running the debugger.

Any ideas?

EDIT - Add the VB6 code:

Implements ITask

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏末 2024-12-25 01:59:59

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

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

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

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

Your description suggests that your VB6 component does contain your class (CLSID) but that when debugging you don't get a component that implements the same interface as your compiled version.

This is probably due to your compatibility settings in your VB6 COM component. You can change them in Project Properties->Component in VB6.

The default setting is "Project compatibility". When you choose this option, then each new version of your component will use the same class ID (CLSID) but get a new interface ID. This happens even though all your public functions and properties are the same as in the previous version. Note that this happens both when you compile your project and when you restart it in Debug mode.
See http://support.microsoft.com/kb/161137 for description of the compatibility modes.

To solve your problem, set the compatibility mode to Binary Compatibility.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文