• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 关于ATL聚合的问题

关于ATL聚合的问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了atl聚合物电芯,atl锂聚合物电芯,atl聚合物电池,atl锂离子聚合物电芯,atl聚合物等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于ATL聚合的问题
描述:

本帖最后由 hailongxl 于 2013-07-08 17:29:29 编辑

问题如下:
一进程外单实例组件CA(EXE)实现了IA接口
一进程内组件CB(DLL)实现了IB接口
CA通过聚合CB对外提供IB接口(在FinalConstruct中已成功创建了CB组件,并在BEGIN_COM_MAP内添加了COM_INTERFACE_ENTRY_AGGREGATE以对外提供IB接口),创建CB的代码如下:
IB *b;
HRESULT hr = CoCreateInstance(__uuidof(CB),GetControllingUnknown(),CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pUnknown);
if(SUCCEEDED(hr))
{
    pUnknown->QueryInterface(IID_IB,(VOID**)&b);//成功
}
编写了如下测试程序(简化):
#import "CA.exe" no_namespace named_guids
#import "CB.dll" no_namespace named_guids
IAPtr a;
a.CreateInstance(__uuidof(CA));//这里可以看到加载了CA.exe,CA.exe也加载了CB.dll
a.CallMethodOfIA();//成功
IB *b;
HRESULT hr = a->QueryInterface(IID_IB,(VOID**)&b);//失败
//第一次调用a->QueryInterface(IID_IB,(VOID**)&b);时返回0x80010105
//第二次调用a->QueryInterface(IID_IB,(VOID**)&b);时返回0x800706BE,CA.exe自动退出了
这是为何?
外部组件完整代码:
/////////////////////////////////////////////////////////////////////////////
// CThermoPrinter
class ATL_NO_VTABLE CThermoPrinter : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CThermoPrinter, &CLSID_ThermoPrinter>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CThermoPrinter>,
public IDispatchImpl<IThermoPrinter, &IID_IThermoPrinter, &LIBID_XFSDRIVER4COMDEVICELib>,
public CProxy_IThermoPrinterEvents<CThermoPrinter>,
public IProvideClassInfo2Impl<&CLSID_ThermoPrinter, &DIID__IThermoPrinterEvents, &LIBID_XFSDRIVER4COMDEVICELib>
{
public:
CThermoPrinter()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_THERMOPRINTER)
DECLARE_NOT_AGGREGATABLE(CThermoPrinter)
DECLARE_CLASSFACTORY_SINGLETON(CThermoPrinter)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
//__uuidof(ILockController)替代IID_ILockController,否则会链接错误unresolved external symbol _IID_ILockController
BEGIN_COM_MAP(CThermoPrinter)
COM_INTERFACE_ENTRY(IThermoPrinter)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(ILockController),m_pLockController)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CThermoPrinter)
CONNECTION_POINT_ENTRY(DIID__IThermoPrinterEvents)
END_CONNECTION_POINT_MAP()
STDMETHOD(FinalConstruct)();
void FinalRelease();
private:
ILockController *m_pLockController;
CLockControllerEventsSink<CThermoPrinter> m_LockControllerEventsSink;

HRESULT CThermoPrinter::FinalConstruct()
{
IUnknown *pUnknown;
//__uuidof(LockController)替代CLSID_ILockControllerEvents,否则会链接错误unresolved external symbol _CLSID_LockController
HRESULT hr = CoCreateInstance(__uuidof(LockController),GetControllingUnknown(),CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pUnknown);
if(SUCCEEDED(hr))
{
//__uuidof(ILockController)替代IID_ILockController,否则会链接错误unresolved external symbol _IID_ILockController
hr = pUnknown->QueryInterface(__uuidof(ILockController),(VOID**)&m_pLockController);
pUnknown->Release();
if(SUCCEEDED(hr))
{
hr = m_LockControllerEventsSink.Connect(this,m_pLockController);
if(FAILED(hr))
m_pLockController->Release();
}
}
return hr;
}
void CThermoPrinter::FinalRelease()
{
if(m_pLockController)
{
m_LockControllerEventsSink.Disconnect();
m_pLockController->Release();
}
}

内部组件部分代码:
class ATL_NO_VTABLE CLockController : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CLockController, &CLSID_LockController>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CLockController>,
public IDispatchImpl<ILockController, &IID_ILockController, &LIBID_XFSLOCKCONTROLLERLib>,
public CProxy_ILockControllerEvents<CLockController>,
public IProvideClassInfo2Impl<&CLSID_LockController, &DIID__ILockControllerEvents, &LIBID_XFSLOCKCONTROLLERLib>
{
public:
CLockController()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_LOCKCONTROLLER)
DECLARE_ONLY_AGGREGATABLE(CLockController)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CLockController)
COM_INTERFACE_ENTRY(ILockController)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CLockController)
CONNECTION_POINT_ENTRY(DIID__ILockControllerEvents)
END_CONNECTION_POINT_MAP()


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于ATL聚合的问题
  • ATL如何实现聚合请大家指点

相关文章

  • 2017-06-04 高手快进来!
  • 2017-06-04 怎么样发送消息使ondrawCDCpDC重画???
  • 2017-06-05 OCX组件公布事件
  • 2017-06-04 请教:ATL编写COM中添加MFC支持的问题
  • 2017-06-05 请教WaitForSingleObject()函数的用法!
  • 2017-06-05 抓图与应用进程和服务进程的关系!(基本上很难,高手请进)
  • 2017-06-04 ATL中怎样才可以让其中一个对象做为另外一个对象的参数
  • 2017-06-04 实现接口的时候遇到,HRESULT,DWORD重定义的问题,急用,谢谢
  • 2017-06-04 COM引入的问题
  • 2017-06-05 idl文件里面要include什么文件才能使用SAFEARRAY?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请大家帮忙:怎样取得母进程ID
    • sleep是怎么实现的
    • VC编写的DLL如何在DELPHI中产生事件?
    • CHtmlView枚举指定的超链接
    • 在ATL的接口函数中能否使用自定义类型参数?
    • 请问如何把一个数据流图在网页上表示出来?
    • ATL返回值的一个问题
    • 如何知道IDispatch中的QueryInterface都支持哪些特定的接口
    • 怎样在ATL程序中调用文件对话框?
    • vs2005做视频播放器-请教各位前辈,小弟很菜,不要笑话我。给四十分啊

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有