COM知识点小结(续一)

转载 2007年10月15日 09:55:00
 

MFC创建COM组件和实现COM连接点的小结

1.如果要在普通工程中使用COM组件,包含以下ATL头文件:

#include <afxdisp.h>

#include <atlbase.h>

//You may derive a class from CComModule and use it if you want to override

//something, but do not change the name of _Module

extern CComModule _Module;

#include <atlcom.h>

注意:头文件顺序不能改变。(不太清楚原因,但是只要头文件顺序改变,complile错误。)

 

 

 

2.从一个连接点机制的实例看开来:

1)按照COM规范来写自定义组件:

一个在client端实现的普通双接口的组件,继承服务器端定义的事件接口如下:

 

 

 

class CMyEvent :

       public IDispatchImpl<_IConnectionObjEvents, &DIID__IConnectionObjEvents, &LIBID_COM_CPLib>,

       public CComObjectRoot

{

public:

       CMyEvent()

       {

       }

BEGIN_COM_MAP(CMyEvent)

       COM_INTERFACE_ENTRY(IDispatch)

       COM_INTERFACE_ENTRY(_IConnectionObjEvents)

END_COM_MAP()

 

 

 

   // IMyEvent methods

       STDMETHODIMP CMyEvent::Click()

       {

              AfxMessageBox("Get message from IConnetionObj");

              return S_OK;

       }

};

其中Click()是自定义事件。

2)客户端工程中按步骤和COM组件建立连接。(思路如此,但我在调试时会弹出调对话框,跟踪发现连接已建立...暂时没有找到原因,如果哪位知道原因请告诉我。)

              HRESULT hr = CoInitialize(NULL);

 

 

 

              if(FAILED(hr))

 

 

 

              {

 

 

 

                     AfxMessageBox("Coinitialize() failed!");

 

 

 

                     return 0 ;

 

 

 

              }

 

 

 

              IUnknown *pIUnknown = NULL;

 

 

 

              hr = CoCreateInstance( CLSID_ConnectionObj , NULL ,

 

 

 

                     CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pIUnknown) ;

 

 

 

              if( FAILED(hr) )

 

 

 

              {

 

 

 

                     AfxMessageBox("Con't get IUnknown interface!");

 

 

 

                     return 0 ;

 

 

 

              }    

 

 

 

              IConnectionObj *pIConnectionObj = NULL; 

 

 

 

              if( pIUnknown!= NULL)

 

 

 

              {

 

 

 

                     hr = pIUnknown->QueryInterface(IID_IConnectionObj, (void **)&pIConnectionObj);

 

 

 

                     if(FAILED(hr))

 

 

 

                     {

 

 

 

                            AfxMessageBox("Can't get IConnectionObj interface!") ;

 

 

 

                            return 0 ;

 

 

 

                     }

 

 

 

              }

 

 

 

              IConnectionPointContainer *pIConnPtCont = NULL;

 

 

 

              if(pIConnectionObj!=NULL)

 

 

 

              {

hr=pIConnectionObj->QueryInterface(IID_IConnectionPointContainer,(LPVOID*)&pIConnPtCont) ;

 

 

 

                     if(FAILED(hr))

 

 

 

                     {

 

 

 

                            AfxMessageBox("Can't get IConnectionPointContainer interface!");

 

 

 

                            return 0;

 

 

 

                     }

 

 

 

              }

 

 

 

              IConnectionPoint *pIConnPt = NULL;

 

 

 

              if(pIConnPtCont!=NULL)

 

 

 

              {

 

 

 

                     hr = pIConnPtCont->FindConnectionPoint (DIID__IConnectionObjEvents, &pIConnPt);

 

 

 

                     if(FAILED(hr))

 

 

 

                     {

 

 

 

                            AfxMessageBox("Can't get IConnectionPoint interface!");

 

 

 

                            return 0;

 

 

 

                     }

 

 

 

              }

 

 

 

              printf("Get IConnectionPoint interface!/n");

 

 

 

 

 

 

              CComObject<CMyEvent> *pEvent = NULL;

 

 

 

              CComObject<CMyEvent>::CreateInstance(&pEvent);

 

 

 

              ASSERT(pEvent);

 

 

 

 

 

 

              // give this pointer to the server

 

 

 

 

 

 

 

              pIUnknown = NULL;

 

 

 

 

              hr = pEvent->QueryInterface(__uuidof(IUnknown), (void **) &pIUnknown);

 

 

 

              if (FAILED(hr))

 

 

 

              {

 

 

 

                     AfxMessageBox("pEvent->QueryInterface() fail!");

 

 

 

                     return 0;

 

 

 

              }

 

 

 

              hr = pIConnPt->Advise(pIUnknown, &dwMyEvt);

 

 

 

              if (FAILED(hr))

 

 

 

              {

 

 

 

                     AfxMessageBox("pIConnPt->Advise() faile!");

 

 

 

                     return 0;

 

 

 

              }

 

 

 

              // Do some work

 

 

 

              pIConnectionObj->DoClick();       //DoClick()server端定义,在client端实现

 

 

 

              hr = pIConnPt->Unadvise( dwMyEvt );

 

 

 

              if (FAILED(hr))

 

 

 

              {

 

 

 

                     AfxMessageBox("pIConnPt->Unadvise() faile");

 

 

 

                     return 0;

 

 

 

              }

              pEvent->Release();

              pIConnPt->Release();

 

 

 

              pIConnPtCont->Release();

 

 

 

              pIConnectionObj->Release();

 

 

 

              pIUnknown->Release();

 

 

 

              CoUninitialize();

 

 

 

       }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JavaOne现场报道(6月11日)

没有了摩肩接踵的拥挤人群,没有了媒体的爆炒,没有了树上掉金币的神话,Java One在略显冷清的同时也回归了技术会议的本质。本次Java One大会最重要的主题就是“Java未来的发展方向”,Sun对...
  • gigix
  • gigix
  • 2003-06-12 10:25:00
  • 2037

ATL中的集合和枚举

ATL中的集合和枚举 一cool - 转载 ( 2004-11-22 11:55:00 ) 类别: VC/MFCCOM中集合和枚举器的关系非常类似于STL中的容器和迭代器的关系。枚举器如果一个COM对...
  • wovow
  • wovow
  • 2004-12-25 18:33:00
  • 975

android 实现左右滑动

效果概览: Circle indicator picture1 picture2 Title indicator: Picture1 ...
  • lujianfeiccie2009
  • lujianfeiccie2009
  • 2012-06-12 16:10:16
  • 444

C++重要知识点总结

  • 2011年06月22日 11:27
  • 5.25MB
  • 下载

线性表的简单总结

  线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,优点是可以随即存取表中任一元素(其存储位置可用一个简单直观的公式表示),缺点是在作插入或删除操作时需移动大量元素。 线性表的...
  • cjphenry
  • cjphenry
  • 2008-06-22 23:18:00
  • 197

SAP MM 知识点(PA考试前总结)

  • 2012年12月10日 11:29
  • 24.62MB
  • 下载

哈夫曼树相关知识点总结

1.哈夫曼树:给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。 2.哈夫曼树是带权路径长度最短的树,权值较...
  • songzige
  • songzige
  • 2016-08-08 20:41:36
  • 697

COM的知识点小结

        1. COM组件的引入方式:(1)#include “ComComponent.h”       #include “ComComponent_i.c”.h头文件中包含组件的声明,_i...
  • cliviajin
  • cliviajin
  • 2007-10-15 09:51:00
  • 579

词法分析阶段实验总结

/* *  解释器构造之任务1---词法分析器 *  作者:国风崽 *  班级:06级2班 *  学号:2006325800**. */实验总结总算完成词法分析器的作业,bug修复了不少,很好的处理注...
  • guofengzai
  • guofengzai
  • 2008-10-19 16:48:00
  • 1300

PTN学习笔记总结

  • 2012年03月09日 13:52
  • 10.37MB
  • 下载
收藏助手
不良信息举报
您举报文章:COM知识点小结(续一)
举报原因:
原因补充:

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