VB6组件上的QueryInterface只在调试器中返回E_NOINTERFACE
QueryInterface on a VB6 component returns E_NOINTERFACE in debugger only
我有一个由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。
要解决这个问题,请将兼容模式设置为二进制兼容
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 为什么模板类中的对象不能返回值