• 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 > 新手求教:进程外com高手赐教啊!

新手求教:进程外com高手赐教啊!

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

佚名通过本文主要向大家介绍了虚心求教,求教,寇准求教,陈大慧向师父求教,求教的意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 新手求教:进程外com高手赐教啊!
描述:

创建了一个进程外com,现在需要几个app共用这个com,现在希望达到如下效果,比如一个app里面createinstance过了,只要这个app不被关掉,那么之后启动的app都将使用原来的实例.看到论坛上有人说过可以用DECLARE_CLASSFACTORY_SINGLETON,单实例进程外组件?我是用ATL创建的com,请问ATL下如何实现单实例进程外组件呢??谢谢
另外进程内com可以通过ICONNECTIONPOINT处理event,那么进程外com也可以通过ICONNECTIONPOINT处理event吗?就是达到com发送一个event,几个app可以同时收到这个event的效果呢?(谢谢,我是com新手,所以问题好多)


解决方案1:

“以下是我com头文件里的部分定义: 
class ATL_NO_VTABLE CSimple02 :  
public CComObjectRootEx <CComSingleThreadModel>, 
public CComCoClass <CSimple02, &CLSID_Simple02>, 
public IConnectionPointContainerImpl <CSimple02>, 
public CProxy_ISimple02Events <CSimple02>, 
public IDispatchImpl <ISimple02, &IID_ISimple02, &LIBID_STEP02Lib> 
{ 
DECLARE_CLASSFACTORY_SINGLETON(CSimple02) 
} 
然后app里面是 
ISimple02 * pISimple02test1; 
hr = CoCreateInstance(CLSID_Simple02, NULL, CLSCTX_ALL, 
IID_ISimple02, (void **)&pISimple02test1); 
ISimple02 * pISimple02test2; 
hr = CoCreateInstance(CLSID_Simple02, NULL, CLSCTX_ALL, 
IID_ISimple02, (void **)&pISimple02test2); 
pISimple02test1和pISimple02test2的内存地址为什么不一样啊??头好大啊 ”
指针当然不一样了,这两个指针是不同的指针。你又没让他们一样。(比如赋值)。
但是他们所指的内容应该是一样的。

解决方案2:

连接点的内容你可以看看 ATL技术内幕,vc会自动生成相应的代码的

解决方案3:

现在我该把IClassFactory* pcf = NULL; 改成CMyClassFactory* pcf = NULL; 吗?          不用,不然com就没有意义了,com传递的是接口
CreateInstance,那我要是继续使用CoCreateInstance是不是还是不能彻底解决我之前的问题?     不会 
推荐用CComPtr<>::CoCreateInstance  这样不用考虑类厂,用起来也方便

解决方案4:

mark 顶

解决方案5:

另外,在微软的知识库也有方法:
Description of an alternative implementation of ATL singleton in Visual C++ 6.0
http://support.microsoft.com/kb/201321

解决方案6:

本帖最后由 laiyiling 于 2008-04-22 12:22:05 编辑

2、
 直接使用CComClassFactorySingleton     
  也可以达到相同的效果。   
  用法非常简单,是直接   
  加一个宏DECLARE_CLASSFACTORY_SINGLETON就可以了   
  当然,实际上,它的原理和你的思路是一样的   
    
  class   CMyClass   :   ...,   public   CComCoClass<   ...   >   
  {   
  public:   
        DECLARE_CLASSFACTORY_SINGLETON(CMyClass)   
    
        ...   
  };
据我所知,DECLARE_CLASSFACTORY_SINGLETON应该只能做到进程内全局对象,你需要进程外,应该用方案1,控制类厂

解决方案7:

我的方案:
1。 实例,必须控制IClassFactory接口。   
  在你的对象类声明里   
  加入   
  DECLARE_CLASSFACTORY_EX(CMyClassFactory)   
  CMyClassFactory是你从CComClassFactory继承来的。   
  重载CreateInstance函数。   
  CreateInstance函数如下   
  HRESULT   CMyClassFactory::CreateInstance(LPUNKNOWN   pUnkOuter,   
  REFIID   riid,   void**   ppvObj)   
  {   
            _ASSERTE(m_pfnCreateInstance   !=   NULL);           HRESULT   hRes   =   E_POINTER;   
            static   void   *   pObj   =   NULL;   //   用于保存实例指针   
            //   如果实例已存在直接返回   
            if(pObj)   
            {   
                      *ppvObj   =   pObj;   
                      ((LPUNKNOWN)pObj)->AddRef();   
                      hRes   =   S_OK;   
            }   
            else   //   不存在创建新的   
            {   
                      hRes   =   m_pfnCreateInstance(pUnkOuter,   riid,   &pObj);   
                      *ppvObj   =   pObj;   
            }   
            return   hRes;   
  }   

解决方案8:

你说的没错啊,在ATL中使用DECLARE_CLASSFACTORY_SINGLETON宏就能实现单实例组件。
第二个问题同1楼

解决方案9:

友情UP~

解决方案10:

1、进程外COM,自己实现类厂。对进程外组件,类厂被COM保存。这样不同的客户端CoCreateInstance不用分别重建类厂,只需申请类厂指针即可。这样就可以保存组件实例在类厂中,从而实现单件。
2、COM都可以用IConnectionPoint来实现事件机制,不管是载体形式。若几个APP都实现了连接点,当然是都得到通知(非单实例)。谁用AtlAdvise注册了就通知谁

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

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

  • 100分求教:如何在ATL中响应Word打开事件??
  • 求教,关于控件名字和控件跨语言调用的问题
  • 极其郁闷:求教在ActiveX控件的对话框上的绘图问题
  • 求教各位用MFC开发OCX控件的朋友
  • 求教啊!软件设计技术方面问题
  • 高分求教:用#import方法调用com组件
  • 求教关于com的类型转化!
  • 求教,atl做的activex视图敢问放大的问题
  • 小弟求教!!!关于操作文本文件
  • 急!求教!如何修改web浏览器插件的右键菜单。

相关文章

  • 2017-06-05 如何在Dll中导出类???
  • 2017-06-04 高手请指点:ActiveX中如何增加一个返回自定类对象的属性或方法???
  • 2017-06-05 KBDLLHOOKSTRUCT为什么,VC说不认识他??????????????头文件也包含了。
  • 2017-06-04 关于导出一个组件的接口,以及接口的方法
  • 2017-06-05 OLE编程:MFC自动化控制PPT的错误,急求解决!!立刻给分!!
  • 2017-06-04 addbitmap的問題
  • 2017-06-04 求助!JS数组传入com组件后如何获取?找了好久还是没找到答案!
  • 2017-06-04 高手进!!!!!!!!!来者有分!!
  • 2017-06-04 VC里用ADO一次记读取100万条记录速度慢
  • 2017-06-04 VC控件的VB使用(在线等待)

文章分类

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

最近更新的内容

    • 如何得到别的程序执行的结果?
    • 卸载DLL的奇怪问题
    • 有个串口通信的dll,我想封装成activex控件,接口函数不怎么会设置?谁帮看看?
    • 关于IDispEventSimpleImpl的问题
    • DLL中创建了一个线程,却将DLL向exe发送的消息阻塞,是什么原因?
    • 求救,正在用mfc编写打印数据库报表的通用activex控件,寻求各位大侠帮助给出思路或相关资源,书籍
    • 请问用VC++60是否可以在W2K下开发16位的DLL,可以的话该如何设置?
    • 急:如何在程序开始运行的时候打开浏览器指向的地址。程序关闭的时候关闭浏览器呢?
    • atl与滚动条
    • 关于在outlook插入工具条的问题Addin

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

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