实现COM消息广播

转载 2006年06月15日 10:00:00

实现COM消息广播

 

大家都知道,为ActiveX控件添加事件处理函数是件容易的事情,IDE已经提供相应的Wizard,为ActiveX控件添加事件处理函数和为一般控件添加事件处理函数没有什么两样。而为普通COM组件添加事件处理函数,就没有这么直观了,必须手工编写相关代码。

 

如果完全手工去编写这些代码,可以说是相当的麻烦,实际上相当编写另外一个COM组件给原组件调用,至少要实现IDispatch接口才行。不过在ATL的帮助下,事情简化了很多。

 

另外一方面,一个组件的事件,只有对应的客户端才能收到,如何把事件变为广播消息,让所有的客户端都知道呢?这个问题容易解决:组件端记录所有的客户端,把事件发给每一个客户端就行了。下面我们看一个简单的例子。

 

一、实现COM组件服务端

(COM组件作为一个服务器在一个单独的EXE内部运行。)

l         VC6新建一个ATL项目server,服务器类型为Executable

l         Insert à New ATL ObjectàObjectsàSimple Object

l         名称为Chat,在属性中选中Support Connection Points(即支持事件)

l         IChat增加接口函数:HRESULT Send(BSTR str);

l         _IchatEvents增加事件:HRESULT OnMessage(BSTR str);

l         ReBuild All

l         右键点击类Cchat, Implement Connection Points

l         Cchat增加一个静态成员,记录所有Cchat对象实例。static std::list<CChat*> s_AllInstances;

l         实现Send函数,该函数中对所有Cchat对象实例触发OnMessage事件。

STDMETHODIMP CChat::Send(BSTR str)

{

         // TODO: Add your implementation code here

         for(std::list<CChat*>::iterator iter = s_AllInstances.begin(); iter != s_AllInstances.end(); iter++)

         {

                   CChat* obj = *iter;

 

                   obj->Fire_OnMessage(str);

         }

        

         return S_OK;

}

二、实现客户端

VC6创建ATL/WTL项目,应用程序类型为Dialog based

CmainDlg继承IdispEventImpl接口。

class CMainDlg : public CAxDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,

                   public CMessageFilter, public CIdleHandler,

                   public IDispEventImpl<0, CMainDlg, &DIID__IChatEvents, &LIBID_SERVERLib>

 

增加事件函数描述信息。

_ATL_FUNC_INFO g_OnMessageInfo = {CC_STDCALL, VT_EMPTY, 1, {VT_BSTR} };

 

实现消息处理函数,不要忘了加_stdcall修饰。

void _stdcall OnRecv(BSTR str)

         {

                   USES_CONVERSION;

                   CListBox lb(GetDlgItem(IDC_LIST_ALL_MESSAGE));

                   lb.InsertString(-1, OLE2A(str));

 

                   return ;

         }

增加事件映射。SINK_ENTRY_INFO 的第一个参数要与IdispEventImpl的第一个参数一致,其取值没有限制。

         BEGIN_SINK_MAP(CMainDlg)

                   SINK_ENTRY_INFO(0, DIID__IChatEvents, 1, OnRecv, &g_OnMessageInfo)

         END_SINK_MAP()

 

调用组件函数。

         LRESULT OnSend(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)

         {

                   char szBuff[1024] = {0};

                   sprintf(szBuff, "(%d):", GetCurrentProcessId());

 

                   this->GetDlgItemText(IDC_EDIT_MESSAGE, szBuff+strlen(szBuff), 1000);

 

                   m_ichat->Send(CComBSTR(szBuff));

                   // TODO : Add Code for control notification handler.

                   return 0;

         }

 

OnInitDialog中增加初始化代码。

                   if(SUCCEEDED(m_ichat.CoCreateInstance(CComBSTR(L"Server.Chat"))))

                   {

                            if(FAILED(DispEventAdvise(m_ichat, &DIID__IChatEvents)))

                            {

                                     MessageBox("DispEventAdvise failed!");

                            }

                   }

                   else

                   {

                            MessageBox("CoCreateInstance failed!");

                   }

CloseDialog中增加~初始化代码。

if(FAILED(DispEventUnadvise(m_ichat, &DIID__IChatEvents)))

                   {

                            MessageBox("DispEventUnadvise failed!");

                   }

实现COM消息广播

导读:   实现COM消息广播      大家都知道,为ActiveX控件添加事件处理函数是件容易的事情,IDE已经提供相应的Wizard,为ActiveX控件添加事件处理函数和为一般控件添加事件处...
  • yingfox
  • yingfox
  • 2007年11月10日 22:33
  • 311

用duplex实现消息广播

http://blog.csdn.net/fangxinggood/article/details/6142861 WCF中定义3种消息交换模式: 1. Request/Repl...
  • yyf_ad
  • yyf_ad
  • 2012年05月29日 22:54
  • 306

Java实现系统内部消息广播的功能

Java 实现系统内部消息广播的功能: 思路:首先数据库要一张消息表,记录消息体信息。包括消息主题、user_id、消息发送时间、过期时间,消息状态(过期,未开始,已广播)。...
  • jpr1990
  • jpr1990
  • 2012年08月05日 23:12
  • 6399

一个简单的com组件的实现

1.什么是com  com是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复...
  • zhuxiufenghust
  • zhuxiufenghust
  • 2010年10月13日 17:43
  • 2420

MSMQ消息广播

安装配置MSMQ消息广播,并验证是否可以发送广播消息,过程实录。   1. 安装MSMQ with broadcasting support 选择安装“消息队列”,并在子选项中选择“多播支持”一...
  • jinshiyill
  • jinshiyill
  • 2015年10月19日 09:48
  • 448

RabbitMQ-消息广播

工作队列 在第一篇教程中,我们已经写了一个从已知队列中发送和获取消息的程序。在这篇教程中,我们将创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Worker)。 工作队...
  • chuan442616909
  • chuan442616909
  • 2017年02月14日 16:35
  • 567

Androidc学习笔记三之BroadcastReceiver广播接收器及单双页模式

android单双页模式   android的广播接收器BroadcastReceiver   android(本地广播  标准广播  有序广播) 2017/3/8 记载 单双页模式 单页模式:手...
  • Mr_li13
  • Mr_li13
  • 2017年03月08日 17:16
  • 453

mangos 消息广播

先上图。下面是文字描述。 我在研究mangos游戏服务器mangosd的时候,在看到用定时器来更新某一区域的天气对象时,看到了mangos在基于地图对象的消息广播流程。下面是我的分析,欢迎指正。 ...
  • qq51931373
  • qq51931373
  • 2014年02月20日 16:54
  • 805

COM连接点 - 一个COM接口实现多个连接点(3)

之前讲到一个COM接口可以实现多个连接点。我们就来写个例子。 其实,我还真不知道怎么用ATL...
  • zj510
  • zj510
  • 2014年09月05日 14:26
  • 1458

2.实现一个最简单的COM

本文实现一个最简单的COM组件,麻雀虽小,五脏俱全,使用完全C++和COM库实现,可以看到整个COM组件的组成脉络。...
  • wenzhou1219
  • wenzhou1219
  • 2016年06月16日 20:16
  • 2189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现COM消息广播
举报原因:
原因补充:

(最多只允许输入30个字)