【转载】COM 连接点
原文:COM 连接点
CLR 完全介绍 COM 连接点 Thottam R. Sriram
来自:http://msdn.microsoft.com/zh-cn/magazine/cc163361.aspx#S1
代码下载位置: CLRInsideOut2007_09.exe (252 KB)
Browse the Code Online
在 COM 服务器上创建连接点
客户端
获取 Add 和 ConnectionPoint 接口
托管客户端
总结
HRESULT Add(int nFirst, int nSecond)
HRESULT AdditionStarted() HRESULT AdditionCompleted(int nResult)
HRESULT Add([in] int nFirst, [in] int nSecond)
library ATLConnectionPointServerLib { importlib("stdole2.tlb"); [ uuid(7F45FEA6-4D7C-489C-A852-19BA8B29D8AB), helpstring("_IAddEvents Interface") ] dispinterface _IAddEvents { properties: methods: [id(1), helpstring("AdditionStarted")]HRESULT AdditionStarted(); [id(2), helpstring("AdditionStarted")] HRESULT AdditionCompleted(int nResult); }; [ uuid(15B6C26A-0416-4C8F-9533-89F318355E31), helpstring("Add Class") ] coclass Add { [default] interface IAdd; [default, source] dispinterface _IAddEvents; }; };
STDMETHODIMP CAdd::Add(int nFirst, int nSecond) { // Fire AdditionStarted event Fire_AdditionStarted(); int nResult = nFirst + nSecond; Sleep(1000); // simulate the addition taking a long time // Fire AdditionCompleted event Fire_AdditionCompleted(nResult); return S_OK; }
- 它必须向您提供 _IAddEvents 接口的实现。
- 它必须向您提供指向服务器 Add 接口的接口指针。
- 它必须获取 Add 接口 ConnectionPoinContainer 的 ConnectionPoint,并添加接收器接口。
- 它必须调用 Add 方法,并等待服务器事件被触发。
- 它必须彻底关闭并退出。
class CSink : _IAddEvents { private: DWORD m_dwRefCount; public: CSink::CSink() {m_dwRefCount = 0;} CSink::~CSink() {} HRESULT STDMETHODCALLTYPE AdditionStarted() { printf("C++ SINK: Addition started event fired ... \n"); return S_OK; }; HRESULT STDMETHODCALLTYPE AdditionCompleted(int nResult) { printf("C++ SINK: Addition completed event fired ... \n"); printf("C++ SINK: Addition result: %d \n",nResult); return S_OK; }; ...
- 获取指向服务器 Add 接口的接口指针。
- 从 Add 接口获取 ConnectionPointContainer 的 ConnectionPoint。
- 向服务器注册接收器接口。
CoInitialize(NULL); hr = CoCreateInstance( CLSID_Add, NULL, CLSCTX_ALL, IID_IAdd, (void **)&pAdd); if(hr != S_OK) { return; }
// Using the interface for add, // query for IConnectionPointContainer interface hr = pAdd->QueryInterface( IID_IConnectionPointContainer,(void **)&pCPC); if ( !SUCCEEDED(hr) ) { return; }
// Using the IConnectionPointContainer, // get the IConnectionPoint interface hr = pCPC->FindConnectionPoint(DIID__IAddEvents,&pCP); if ( !SUCCEEDED(hr) ) { return; }
// Create an instance of the sink object to pass // to the server pSink = new CSink(); if ( NULL == pSink ) { return; } // Get the interface pointer to CSink's IUnknown pointer, which you // will pass to the server hr = pSink->QueryInterface (IID_IUnknown,(void **)&pSinkUnk); if(!SUCCEEDED(hr)) { return; }
// Pass the sink interface to the server through the Advise hr = pCP->Advise(pSinkUnk,&dwAdvise); if(!SUCCEEDED(hr)) { return; }
pAdd->Add(1, 5);
// Release the IConnectionPointContainer interface. if(pCPC != NULL) pCPC->Release(); // Unadvise the event call back we registered. if(pCP != NULL) { pCP->Unadvise(dwAdvise); } if(pSinkUnk != NULL) { pSinkUnk->Release(); } // Disconnect from the server. if(pCP != NULL) { pCP->Release(); } // Release interfaces. if(pAdd != NULL) { pAdd->Release(); } CoUninitialize(); return;
cl COMConnectionPointClient.cpp
C++ SINK: Addition started event fired ... C++ SINK: Addition completed event fired ... C++ SINK: Addition result: 6
tlbimp ATLConnectionPointServer.dll
public class ManagedSink :_IAddEvents { public void AdditionStarted() { Console.WriteLine("C# SINK: Addition started event fired ..."); } public void AdditionCompleted(int nResult) { Console.WriteLine("C# SINK: Addition completed event fired ..."); Console.WriteLine("C# SINK: Addition result: {0}", nResult); return; } };
// Pass the sink interface to the server through the Advise hr = pCP->Advise(pSinkUnk,&dwAdvise); if(!SUCCEEDED(hr)) { return;}
ManagedSink ms = new ManagedSink();
AddClass a = new AddClass(); a.AdditionStarted += ms.AdditionStarted; a.AdditionCompleted += ms.AdditionCompleted;
a.Add(1, 5); a.AdditionStarted -= ms.AdditionStarted; a.AdditionCompleted -= ms.AdditionCompleted;
csc /r:ATLConnectionPointServerLib.dll ManagedClient.cs
C# SINK: Addition started event fired ... C# SINK: Addition completed event fired ... C# SINK: Addition result: 6
转载于:https://www.cnblogs.com/zhehan54/p/5909760.html
【转载】COM 连接点相关推荐
- 3D中的OBJ文件格式详解(转载)
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...
- 在Windows下创建硬连接和文件夹连接点的工具
之前提到过在Windows[NTFS]下面创建硬连接的命令行工具(请看<简化创建硬连接命令>),有没有更方便的方法呢?请看这次推荐的几个工具:(这三个工具都可以到http://schina ...
- Spring框架介绍及使用(转载)
原文链接 Spring框架-控制反转(IOC) 1 Spring框架概述 1.1 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由R ...
- Visio 快捷大全(转载)
Visio 快捷大全 时间:2011-11-20 11:59:48 来源: 作者: 非常好用的制图软件.尤其在系统结构设计方面,能快速勾画出系统结构图. "帮助"任务窗格和&q ...
- OpenGL帧缓存对象(FBO:Frame Buffer Object)(转载)
原文地址http://www.songho.ca/opengl/gl_fbo.html 但有改动. OpenGL Frame BufferObject(FBO) Overview: 在OpenGL渲染 ...
- 基于注解的Spring AOP的配置和使用--转载
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- [转载]Office Visio快捷键
"帮助"任务窗格和"帮助"窗口 使用"帮助"任务窗格和"帮助"窗口 通过"帮助"任务窗格,您可以访问 ...
- WIN7系统中连接点(Junction Points)
与xp.win2003相比,win7.win2008(包括win2008R2)系统中,存放用户数据(user data)和系统数据(system data)的默认文件夹位置发生变化.例如,在xp中存放 ...
- 转载:Spring AOP (下)
昨天记录了Spring AOP学习的一部分(http://www.cnblogs.com/yanbincn/archive/2012/08/13/2635413.html),本来是想一口气梳理完的.但 ...
最新文章
- 设计师不应该错过的响应式设计框架(含优缺点分析)
- python Selenium 常见操作 元素定位
- (常用API)正则表达式语法规则
- Linux目录遍历实现,列出目录下文件,可使用部分参数
- SpringBoot项目新手——问题疑惑及解决笔记
- java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题
- dede mysql语句_让dede运行php代码和mysql语句
- 吴恩达深度学习 —— 2.18(选修)逻辑回归损失函数的解释
- spring boot—默认日志框架配置
- day27 粘包及粘包的解决方案
- 如何在《救赎之路》中使用CPU粒子效果
- 创建数据库常用SQL语句
- 兄弟打印机内存已满清零方法_兄弟打印机清零方法大全
- 学生DW网页设计作业成品——电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
- Visio连接线设置箭头形状失效
- 《东周列国志》第八十七回 说秦君卫鞅变法 辞鬼谷孙膑下山
- 三维地理信息系统空间的可视分析
- php身份证识别ORC
- 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
- 135编辑器嵌入html,135编辑器教程|三步教你搞定表格样式
热门文章
- webstorm怎么跑项目_快讯!明年厦门中考体育项目定了!初三家长抽的!其他地市抽到啥?...
- SpringData JPA条件查询、排序、分页查询
- java配置文件中的plugin,启用ContextReplacementPlugin以忽略webpack中的配置和测试设置文件...
- java inflaterinputstream_java.util.zip.InflaterInputStream.available()方法示例
- 互动赠书 | 云上云下K8s多集群如何实现集群管理和安全治理的一致体验?
- 基于 KubeVela 与 Kubernetes 打造“无限能力”的开放 PaaS
- 基于 K8s 做应用发布的工具那么多, 阿里为啥选择灰姑娘般的 Tekton ?
- 曾宝仪和机器人_你愿意和机器人成为终身伴侣吗?
- linux设置双屏拼接_双屏办公,用起来到底有多爽
- tornado项目搭建_Day71-73 BBS项目(1)