- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我通过 CreateInstance
创建了一个对象 A,该对象又创建了一个对象 B。这两个对象应该存在于同一个进程中。
现在我看到对象 B 在请求某个接口(interface)时返回 E_NOINTERFACE,尽管我在 COM_MAP 中定义了它:
class B:
{
// ....
BEGIN_COM_MAP(B)
COM_INTERFACE_ENTRY(IB)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IXXX) // the interface I'm interested in
END_COM_MAP()
// .....
};
A 代码:
#define FORWARD_ERROR( expr ) { hr=expr; if( !SUCCEEDED( hr ) ) return hr;}
IBPtr b;
FORWARD_ERROR( b.CreateInstance( __uuidof( B ), 0, CLSCTX_INPROC_SERVER ) );
IXXXPtr x;
HRESULT hrIf = b.QueryInterface( __uuidof( IXXX ), x );
// ===> now x is NULL, and hrIf contains E_NOINTERFACE
当我调试它并在 COM_MAP 中放置一个断点时,我没有在最低帧中看到我的源代码,而是一些 ole32.dll 的 CRpcThread::WorkerLoop
。
我不知道我是如何指示应该通过 OLE 和 RPC 调用 QueryInterface
的。有什么想法吗?
最佳答案
根据你的描述肯定是marshalling kicking in .编码是通过 RPC 隧道调用完成的,因此它看起来很奇怪,但这就是它在 Windows 上完成的方式。
消费者线程可能使用 COINIT_APARTMENTTHREADED
调用了 CoInitializeEx()
。由于要创建的对象被标记为 Free
,因此它不可能在调用者的公寓中创建(参见 this very good explanation on apartments )。相反,COM 试图打开编码,而您可能没有 anything to facilitate marshalling在这种情况下 CoCreateInstance()
返回 E_NOINTERFACE
因为 COM 内部工作请求 a bunch of interfaces it would use for marshalling一旦所有这些请求都失败,它就会以 E_NOINTERFACE
结束并返回它,这当然对您来说一点都不方便。
然后你从 Free
更改为 Both
这意味着 "Apartment
of Free
as COM sees fit" COM 被正式允许将对象放入与调用者相同的单元中,并且不需要编码,因此您不会再看到那个看起来很奇怪的错误代码。
关于c++ - 不情愿地通过 RPC 调用 QueryInterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6015789/
我有一个非托管 C++ 类,其中有一个 com 映射。例如: BEGIN_COM_MAP (MyClass) COM_INTERFACE_ENTRY(...) END_COM_MAP 但是现在如果
问题: 我在代理上成功调用了 CoSetProxyBlanket(如果这是正确的术语),然后我在同一个代理上调用了 QueryInterface,但我收到了 0x80070005(“拒绝访问”)的结果
如果我有 IUnknown *ptr , 我需要调用Release()在我通过ptr->QueryInterface()获得的每个界面上, 另外调用ptr->Release()当我完成 ptr ? 我
我试图找到这个问题的答案,但完全没有运气。没有关于如何使用 Marshal.QueryInterface 返回的值的文档。 (在我的情况下是“pISomething”)。它是 IntPtr 的一个实例
考虑以下代码: TMyList = class(TList, IMyList) Delphi 向我显示错误: [DCC Error] test.pas(104): E2003 Undeclared i
我写了这段代码 'use strict'; module.exports = { up: (queryInterface, Sequelize) => { }, down: (queryI
假设我有一个实现两个或多个 COM 接口(interface)的类(与 here 完全一样): class CMyClass : public IInterface1, public IInterfa
IUnknown::QueryInterface() 被传递了一个 void** 参数,表示放置检索到的接口(interface)的地址。 STDMETHOD QueryInterface(/* [i
我想将此 USB 检测器转换为 Swift 3 https://gist.github.com/zachbadgett/471d72e83fee413d0f38 但是我卡在了这条线上: let dev
我正在尝试使用 Word 文档中的一些嵌入对象。较早的张贴者告诉我,这不是直截了当的。以下是链接答案的摘录: "As I mentioned earlier, utilizing the embedd
queryInterface.removeConstraint() 的文档没有记录可以传递给 removeConstraint() 方法的 options 对象。事实上,没有记录可以传递给各种 que
我在实用程序库中遇到问题,它执行一些 COM 互操作。它保留对在调用之间使用的 COM 对象的引用。 如果所有方法都是从使用相同 COM 线程模型的线程调用的,则该类可以正常工作。 但是,如果创建 C
是否可以为使用 ATL 的类提供 QueryInterface 的实现? BEGIN_COM_MAP(CConcrete) // Defines _InternalQueryInterface C
在我的应用程序中,我通过 CreateInstance 创建了一个对象 A,该对象又创建了一个对象 B。这两个对象应该存在于同一个进程中。 现在我看到对象 B 在请求某个接口(interface)时返
以上是否可行? 我可以这样做吗: IUnknown *punk; punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface); 我认为
我正在尝试在现有 COM 组件中构建连接点。我从 CCmdTarget 派生类,并按照 MSDN 中的描述在类声明和实现中调用 MFC 宏。组件已正确构建、链接和运行。但是,当我调试我的客户端应用程序
这个问题在这里已经有了答案: Handling CoCreateInstance return value (2 个答案) 关闭 8 年前。 设想一种情况: CComPtr pGraph; HRES
我想知道是否有更简洁的方法来编写下面的(工作)代码: uint uEnum = 0; PStore.EnumTypes(0, 0, ref uEnum); System.Reflection.Memb
IUnknown::QueryInterface() 的典型实现方式如下:为每个支持的接口(interface) ID 使用一个 if-else-if 链并执行以下操作: if( iid == __u
我明白 QueryInterface 是什么方法实际上是这样做的——它只返回一个指向特定接口(interface)的指针。但我的问题是,我为什么要使用这种方法? 我的意思是,有什么区别 QueryIn
我是一名优秀的程序员,十分优秀!