Com 内部聚合接口不可访问

Com 内部聚合接口不可访问,com,aggregation,Com,Aggregation,我从32位应用程序实例化了一个64位COM服务器(m_pServer是一个进程外对象,在本例中也是外部对象)。但是,当我尝试访问32位应用程序中的64位内部对象(m_InnerCtrl)时,它既无法执行封送处理,也无法执行我不知道的其他操作 hr = m_pServer.CreateInstance(__uuidof(Server), NULL, CLSCTX_LOCAL_SERVER);//64 bit from 32 bit m_InnerCtrl = m_pServer;// this

我从32位应用程序实例化了一个64位COM服务器(m_pServer是一个进程外对象,在本例中也是外部对象)。但是,当我尝试访问32位应用程序中的64位内部对象(m_InnerCtrl)时,它既无法执行封送处理,也无法执行我不知道的其他操作

hr = m_pServer.CreateInstance(__uuidof(Server), NULL, CLSCTX_LOCAL_SERVER);//64 bit from 32 bit

m_InnerCtrl = m_pServer;// this does not initialize the inner 

为了在单元之间、进程之间或机器之间使用接口,接口必须具有代理/存根实现
IUnknown
附带默认的代理/存根实现。因此,您可以为任何可以在进程外实例化的类获取
IUnknown
。但是,如果您的自定义接口没有代理/存根,您将无法为该接口使用QI,因为COM不知道如何代理该接口

对于已知的COM场景(例如,自动化),有几种默认代理/存根实现,但a)它们并不总是工作,这取决于接口的定义方式;b)取决于您使用的注册机制,它们并不总是得到注册;c)在某些场景中,现成的代理/存根的性能不如根据其所用的特定接口硬编码的代理/存根。我通常更喜欢使用IDL自动生成的代码构建自己的代理/存根。这将产生可用性最广、性能最高的代理/存根实现

不幸的是,我无法简单地指导您如何构建和注册代理/存根,因为这是一个复杂的主题,具体步骤将取决于您的项目的当前状态以及它是如何进入该状态的。我建议您阅读COM代理/存根实现以及它与IDL和ATL的关系。如果您使用VC++启动一个新的ATL项目并向其中添加一个对象,您会发现项目向导或新对象向导中的某些选项专门用于设置代理


我在学习这一点时发现有一个练习很有用:使用向导中选择的不同选项创建多个项目,然后使用diff工具比较这些项目,以查看选项对每个项目的影响。

不清楚您在问什么。
m_pServer
m_InnerCtrl
的类型是什么?它们是COM/ATL智能指针吗?如果是这样,那么第二行代码应该执行
QueryInterface
m_InnerCtrl
的接口是否可代理?是的,它们是智能指针IUnknownPtr m_pServer;IInnerCtrlPtr m_InnerCtrl。。不,我不需要在外部执行QI,它在32位版本中一直工作。
=
操作符自动执行
查询接口。
IInnerCtrl
接口是否已注册,以便在64位和32位进程中都可以代理?要尝试的一件事是在
m\u pServer
上手动执行QI,然后查看返回的
HRESULT
结果。开始\u COM\u映射(服务器)COM\u接口\u条目\u自动聚合\u盲(m\u punkinerctrl.p,\u uuidof(InnerCtrl))如何实现代理/存根?一个单独的DLL?合并到同一个DLL中?代理/存根正在注册吗?谢谢。我会试试你提到的东西。感谢你花时间给出详细的答案!Chearsan其他建议:proxy/stub本身是另一个COM类,它实现了自定义接口和一些专门用于将其初始化为proxy/stub的附加接口。因为它是一个COM类,所以可以像其他类一样直接实例化它。代理/存根类的CLSID作为接口注册表项的子项放入注册表。查找自定义接口的32位注册表项(在Wow6432Node中)。验证它是否具有ProxyStubClsid32子项。然后尝试直接从32位进程中实例化该CLSID。一个32位测试客户机,它将实例化包含64位内部接口的proc服务器外的64位测试。但它不起作用。我尝试了>>的两个选项,允许合并代理和存根,并创建一个单独的PS项目。。还验证了ProxyStubClsid32子项是否存在,但仍然无效。有什么地方我可以把样品代码贴出来检查吗!让我的示例项目正常工作..选择线程模型时,会同时选择outof proc和innerobject。不知道这是否有任何影响…早些时候..正在使用FREEHmmm。我想不出为什么那样会有任何效果。代理/存根必须支持这两种线程模型,因为代理将在运行客户端代码的同一单元/进程/计算机中创建。存根(它与代理是同一个类)将在与服务器对象相同的单元中创建。现成的代理/存根和根据自动生成的代码构建的p/s都在任一线程模型中工作,并支持使用任一线程模型的服务器对象。但是如果你有一些有用的东西,你可能会发现一些东西。