- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个由 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/
我有一个COM客户端和一个COM服务器,COM服务器持有客户端暴露的接口(interface),现在客户端实际上只是一个EXE,我如何确保客户端暴露的接口(interface)对服务器可见? 因为当我
我正在从 C++ 非托管代码调用 C# 方法。我在从数组中返回的类实例获取值时遇到问题。 我稍微简化了代码 这是有问题的方法。 [return: MarshalAs(UnmanagedType
我正在尝试在现有 COM 组件中构建连接点。我从 CCmdTarget 派生类,并按照 MSDN 中的描述在类声明和实现中调用 MFC 宏。组件已正确构建、链接和运行。但是,当我调试我的客户端应用程序
我正在尝试为我拥有的 COM 对象(名为 SC_COM.dll)生成 C# 包装器,但在将它与 Visual Studio 2008(运行 Vista)链接时遇到一些问题。我需要使用 COM DLL
我已经成功编译并注册了一个直接显示过滤器。现在我想在我的代码中使用它。但是对 COCreateInstance 的调用返回错误代码 E_NOINTERFACE。 这是我的过滤器的注册码 #inclu
注意: 使用 CoGetClassObject , 通过在系统注册表中有 CLSID 的类对象创建多个对象 单线程单元 例如: hresult = CoInitializeEx(NULL, COINI
在我使用 DirectX11 设计的渲染器中,我需要能够随时创建交换链,但是我使用的方法在 CreateSwapChain() 调用时崩溃了: IDXGIDevice * device;
我正在尝试创建一个指定的 D3D12 设备 https://msdn.microsoft.com/en-us/library/dn899120%28v=vs.85%29.aspx 我有 NVidia
我刚刚开始使用 Dx11。 D3DX11CreateEffectFromMemory 正在返回 E_NOINTERFACE。 我知道 E_NOINTERFACE 在 COM 方面意味着什么,但我不知道
我负责 C# 应用程序 (VS 2005) 的维护。此 C# 应用程序调用一个 dll(“mydll.dll”)。我需要对有问题的 dll 进行一些更改。 我有一个用 Visual Basic 6.0
我正在使用 CoCreateInstance 函数创建与指定 CLSID 关联的类的单个对象。它返回 E_NOINTERFACE。 我检查了注册表,CLSID 是正确的。被调用对象dll的路径在注册表
我正在尝试从我的集成相机上的输出引脚检索 IAMStreamConfig 接口(interface),但是 E_NOINTERFACE 失败。 我将 IntCam 用作测试设备,实际上我将有一个带有两
我已经搞不清是应该从我的 COM 服务器方法返回 E_NOTIMPL 还是 E_NOINTERFACE。 我有一个类有两个函数,我从我继承的类中覆盖了这两个函数,这两个函数什么都不做,因为它们目前还没
我有一个 COM 类 CMyCOMServer 在一个应用程序中实现了 IMyInterface,两者都具有正确的 GUID。如果请求 IUnknown 或 IMyInterface,CMyCOMSe
我有一个由 VB6 COM 对象实现的接口(interface) (ITask)。我有一个使用该接口(interface)的 C++ COM 对象,它通常工作正常。 但是,当我运行 VB6 调试器来调
我正在尝试从 64 位应用程序创建 32 位 COM 对象。 我在 CoCreateInstance 调用中使用了 CLSCTX_LOCAL_SERVER,并且我向 AppId 添加了一个空的 Dll
我一直在尝试制作一个利用桌面复制 api 的应用程序,但没有使用 directx 的经验,结果证明这是一个相当大的挑战。似乎一切正常,直到我调用 output1->DuplicateOutput(),
嗨 Stack Overflow 成员, 我是 C# 编程的新手。我正在开发一个基本的相机流和静态捕获应用程序。一旦用户静止不动,我将使用 VMR9 的位图混合概念在叠加层上显示它。 我做了什么? 我
我正在尝试使用 IFileSystemImage2 接口(interface)使用 Imapi2 创建具有多个引导记录的 ISO。 为此,我应该能够使用 put_BootImageOptionsArr
我正在尝试在我的 Win32 应用程序中嵌入一个 WMP 控件。我在这里遵循了示例代码:Hosting the Windows Media Player Control in a Windows Ap
我是一名优秀的程序员,十分优秀!