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();

 

 

 

       }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

非常全面的Linux知识点总结

$1 我的Linux需求 Linux博大精深。我只在此讨论一些我对线上Linux机器维护人员的基本需求,比如装机,加硬盘,配网络。只讨论CentOS 6,或者类似的RHEL,当然Ubuntu也可以此...
  • zhouboyu
  • zhouboyu
  • 2016年05月11日 03:15
  • 1490

springMVC知识点学习笔记

一、 springMVC开发框架原理图 其中的组件: 1,前端控制器DispatcherServlet(不需要程序员开发) 作用是接收请求,响应结果,相当于转发器 2,处理器映...
  • jaryle
  • jaryle
  • 2016年05月07日 20:36
  • 1326

Android 知识点梳理,较完整

说明:本篇博客只是一个知识整理,因为网上对于Android的知识介绍足够多,因此我不再写相关文章(主要是因为我写的不如人家好),所以所有文章均来自网络,不贴原文章,只提供连接,因此本文旨在减少你对相关...
  • u011240877
  • u011240877
  • 2016年07月26日 13:25
  • 10501

Struts2知识点小结-非常实用

  • 2010年05月17日 14:49
  • 151KB
  • 下载

C++重要知识点小结---2

C++重要知识点小结---2 C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不...
  • lejun2011
  • lejun2011
  • 2013年09月18日 10:08
  • 1066

__attribute__小结,学习C语言你不可放过的知识点

GNU C 的一大特色就是attribute 机制。attribute 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Typ...
  • andrewgithub
  • andrewgithub
  • 2017年12月21日 09:09
  • 69

程序员常见面试之 数据库 知识点小结(二)

前言笔者悉心整理的数据库面试知识点,希望对各位朋友有所帮助。 文章链接 http://blog.csdn.net/never_cxb/article/details/50420521 ,转载请保留出...
  • never_cxb
  • never_cxb
  • 2015年12月24日 21:43
  • 1417

【技术小结1】实习40多天所接触的.NET知识点与心得

今年暑假,找了份关于.NET方面的实习工作。一个月下来,主要是对自己所学的知识进行梳理,同时分享给对于刚入门.NET的新手。希望大家能相互学习。      知识点一:公司的开发框架       对于公...
  • h398085541
  • h398085541
  • 2015年08月19日 16:08
  • 447

android之知识点小结二

SharedPreferences的使用: 在这里也是偏向于使用android自带的SharedPreferences管理机制,简要说明使用流程,备忘: 首先在主activity里面初始化Shared...
  • jason0539
  • jason0539
  • 2013年08月19日 08:40
  • 2707

工作中自己遇到的知识点模糊或者思路堵塞小结(1)

学习surfaceView 1 : setZOrderOnTop(true); mHolder.setFormat(PixelFormat.TRANSPARENT);//设置...
  • qdh186
  • qdh186
  • 2016年07月25日 20:25
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM知识点小结(续一)
举报原因:
原因补充:

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