• 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

佚名通过本文主要向大家介绍了 只创建COM对象的一个实例?等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 只创建COM对象的一个实例?
描述:

我实现的一个COM对象(COM EXE),我希望无论多少个CLIENT连接,都只创建一个实例,每个客户都获得同一个实例的接口,因为这个COM对象是一个仪器控制测量的COM,如果创建多个实例,涉及到资源的问题。
class ATL_NO_VTABLE CControl : 
public CComObjectRoot,//CComObjectRootEx<CComMultiThreadModel>,//CComSingleThreadModel>,
public CComCoClass<CControl, &CLSID_Control>,
public IConnectionPointContainerImpl<CControl>,
public IDispatchImpl<IControl, &IID_IControl, &LIBID_POWERCOMPLib>,
public IDispatchImpl<IConfigure, &IID_IConfigure, &LIBID_POWERCOMPLib>,//手动添加
public IDataStatus, //手动添加
public ISupportErrorInfo,//手动添加
public CProxy_IControlEvents< CControl >//,
{
...
private:
        CDevice1 *dev1;//这是我的设备类,在FinalConstruct中创建,它将使用计算机端口资源,所以不能创建多份实例。
}
初学COM,不知我的想法正不正确?


解决方案1:

我记得有一个getactiveobject(),不知道能不能干活。你可以在cocreateinstance之前getactiveobject()一下,看有没有该组件的实例存在,没有再创建,有就直接拿过来用了。

解决方案2:

使用CComSingleThreadModel作为CComObjectRootEx的模板参数是说,组件实例创建在进程的主STA中,对这个组件的创建和调用都会交由进程中的主STA完成,组件实例只有一个,所有客户的访问会是队列式的,且所有数据成员(包括全局和静态成员)不需要同步
当然如果有并发性要求,也可以使用CComMultiThreadModel作为CComObjectRootEx的模板参数,组件实例创建在进程的主MTA中,因为MTA在进程中是唯一的,所以组件实例也只有一个,所有客户的访问会是并发的,所有数据成员需要同步
另外,楼主做的是进程外组件(exe),还要保证服务器进程的唯一性,所以在类场代码中对CoRegisterClassObject调用时,倒数第二参数有要求(具体是什么忘了),以保证服务器进程只创建一个。
累,不对的请高手详细指正。

解决方案3:

楼上说的不对,感觉要改写atl的生成的IClassFactory的实现,得到存在的接口指针。
至于如何得到,期待高手出现

解决方案4:

添加DECLARE_CLASSFACTORY_SINGLETON(CEtermApps)
class ATL_NO_VTABLE CEtermApps : 
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CEtermApps, &CLSID_EtermApps>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CEtermApps>,
public IDispatchImpl<IEtermApps, &IID_IEtermApps, &LIBID_ETERMINTERFACELib>
{
public:
CEtermApps()
{
i=0;
}
DECLARE_CLASSFACTORY_SINGLETON(CEtermApps)
DECLARE_REGISTRY_RESOURCEID(IDR_ETERMAPPS)
DECLARE_PROTECT_FINAL_CONSTRUCT()


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

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

相关文章

  • 2017-06-04 给VC程序添加脚本支持,如何将结果返回给程序
  • 2017-06-04 ASP调用VB编写的ActiveXDLL的问题
  • 2017-06-04 使用mts(#include<mtxh>)后,try块好像失效了。
  • 2017-06-04 Com问题!分少,很sorry!
  • 2017-06-04 问个ActiveX接口的问题,怎么定义一个接口传递一个函数指针进去
  • 2017-06-04 请教:进程外组件服务器是不是专指EXE形式的COM?它们能独立运行吗?立即结帐,谢谢!
  • 2017-06-05 强行终止SOCKET线程后,系统提示内存未释放,求高手解答
  • 2017-06-04 反对日本成为安理会常任理事国全球华人大签名signsjwarorg(上这个网看看请大家积极参与
  • 2017-06-04 修改IE属性怎样立即见效?
  • 2017-06-05 问一个RUNTIME_CLASS的简单线程问题

文章分类

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

最近更新的内容

    • ActiveX初级问题
    • 如何在ActiveX控件无窗口中,设置SetTimer函数!
    • 申明一个链表然后把一个变量插到任意一个位置。。请高手指教。不要用MFCc++的语法就可以
    • 微软在COM+下犯的严重低级错误
    • 如何阅读vnc源代码
    • windowsmobile6中创建IWebBrowser2接口失败
    • 关于directshow和directmusic部分问题
    • 用WTL的CListViewCtrl构建List,向List中插入数据遇到的问题。
    • 如何取得window2000下命令提示符下的输出取到管道里,然后把输出信息取出显示在Edit控键里头?
    • 小弟求助,大虾请进——在vc中要加入一个ole编辑匡,可以嵌入word,编辑后存入数据库,如何实现

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

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