【转载】COM 连接点
原文:COM 连接点
CLR 完全介绍 COM 连接点 Thottam R. Sriram
来自:http://msdn.microsoft.com/zh-cn/magazine/cc163361.aspx#S1
代码下载位置: CLRInsideOut2007_09.exe (252 KB)
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
【转载】COM 连接点的更多相关文章
- 【转载】COM 组件设计与应用(十六)——连接点(vc.net)
原文:http://vckbase.com/index.php/wv/1257.html 一.前言 上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了. 二.原理 图一.连接点组件原理图.左侧 ...
- 【转载】COM 组件设计与应用(十五)——连接点(vc6.0)
原文:http://vckbase.com/index.php/wv/1256.html 一.前言 上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了. 二.原理 图一.连接点组件原理图.左侧 ...
- [转载]Office Visio快捷键
“帮助”任务窗格和“帮助”窗口 使用“帮助”任务窗格和“帮助”窗口 通过“帮助”任务窗格,您可以访问“Microsoft Office Visio 帮助”的全部内容,该窗格显示为 Microsoft ...
- c#winform使用WebBrowser 大全[超长文转载]
1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispose 方法,以便确保及时释放所有资源.必须在附加事件的同一线程上调用 ...
- [转载] ZooKeeper实现分布式队列Queue
转载自http://blog.fens.me/zookeeper-queue/ 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户 ...
- [matlab] 18.图与网络 (转载)
基本概念: 图论[Graph Theory]是数学的一个分支.它以图为研究对象.图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连 ...
- 【转载】COM小结
原文:http://blog.csdn.net/byxdaz/article/details/6595210 一.Com概念 所谓COM(Componet Object Model,组件对象模型),是 ...
- GetLastError 错误码大全(转载)
转载自:GetLastError GetLastError GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数 并无必要设置上一 ...
- ConcurrentHashMap源码分析(JDK8版本<转载>)
注:本文源码是JDK8的版本,与之前的版本有较大差异 转载地址:http://blog.csdn.net/u010723709/article/details/48007881 ConcurrentH ...
随机推荐
- 【linux】xrander/cvt自定义分辨率
今天在虚拟机上装了一个LUbuntux64(12.10)玩,安装的时候,由于主板默认是没有开虚拟化支持,报错,改后相当的顺利.但是进入系统后,屏幕显示分辨率为800X600的,全屏的话,在大显示器上显 ...
- microsoft .netframework Available Source Code Components
http://referencesource.microsoft.com/netframework.aspx http://blogs.msdn.com/b/dotnet/archive/2012/0 ...
- WebDriver一些常见问题的解决方法【转】
转至:http://www.cnblogs.com/sylovezp/p/4329770.html 1.Exception NoSuchElementException: 解决方法: 1)检查目标el ...
- CentOS:安装桌面GNOME图形化界面
u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...
- Couchbase
Couchbase介绍,更好的Cache系统 在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度. 术语 节点:指集群里的一台服务器. 现 ...
- android 项目学习随笔十(自定义ProgressBar)
android:innerRadius 内部半径 android:thickness 厚度 gradient 渐变 android:useLevel="false" 取掉控件自带旋 ...
- 苹果系统直接读写 ntfs 磁盘
苹果系统对 ntfs 能读,但不能写. 方案1:修改 fstab 法 ======================================== 读写支持.在使用本教学文章之前,请先确定你没有安 ...
- 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- 【PHP设计模式 01_DuoTai.php】多态的说明
<?php /** * [多态] * 定义一个抽象类:Tiger,有两个子类:XTiger 和 MTiger */ header("Content-type: text/html; c ...
- HDU 5898:odd-even number(数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数.(1< ...