我从32位应用程序实例化一个64位COM服务器(m_pServer一个OUT的proc ...在这种情况下也是外部对象)。但是当我尝试在我的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
答案 0 :(得分:0)
为了在公寓之间,进程之间或计算机之间使用接口,接口必须具有代理/存根实现。 IUnknown
附带默认的代理/存根实现。因此,您可以为任何可以在进程外实例化的类获取IUnknown
。但是,如果您的自定义界面没有代理/存根,您将无法对该界面进行QI,因为COM不知道如何代理该界面。
对于已知的COM场景(例如自动化),有一些默认的代理/存根实现,但是a)它们始终不起作用,具体取决于界面的定义方式,b)取决于注册您正在使用的机制,它们并不总是被注册,并且c)在某些情况下,开箱即用的代理/存根不会像代理/存根一样执行根据它所针对的特定接口进行硬编码。我通常更喜欢使用从IDL自动生成的代码构建自己的代理/存根。这产生了最广泛使用且性能最高的代理/存根实现。
不幸的是,我无法简明地指导您如何构建和注册代理/存根,因为它是一个复杂的主题,具体步骤将取决于项目的当前状态以及它如何进入该状态。我建议你阅读COM代理/存根实现以及它与IDL和ATL的关系。如果使用VC ++启动一个新的ATL项目并向其添加一个对象,您将发现项目向导或新建对象向导中的某些选项专门用于设置代理。
我在学习这个时发现有用的一个练习:创建在向导中选择了不同选项的多个项目,然后使用diff工具比较项目以查看选项对每个项目的影响。