本文共 1474 字,大约阅读时间需要 4 分钟。
转载请标明是引用于
例子代码:(包括客户端与服务端)
接着我的上一篇文章,,接下来我们来创建一个连接点的示例。
1、创建ATL智能设备工程。
在创建完工程后到类视图中右击
此时出现了CProxy_IAddEvents<T>和IAdd
2、为IAdd添加一个Add(int a, int b)方法
3、为_IAddEvents接口添加ExecutionOver(int Result)方法。
该方法来用通知用户已经执行完IAdd接口中的Add方法
接下来试编译一下,发现提示如下错误
1>Add.cpp 1>c:\documents and settings\administrator\桌面\connectioncon\Add.h(73) : error C2039: 'UpdateRegistry' : is not a member of 'CAdd' 1> c:\documents and settings\administrator\桌面\connectioncon\Add.h(29) : see declaration of 'CAdd' 1>c:\documents and settings\administrator\桌面\connectioncon\Add.h(73) : error C2065: 'UpdateRegistry' : undeclared identifier
参考文章
后把Add.h里的
#ifndef _CE_DCOMDECLARE_REGISTRY_RESOURCEID(IDR_ADD)#endif
改为
//#ifndef _CE_DCOMDECLARE_REGISTRY_RESOURCEID(IDR_ADD)//#endif
4、修改_IAddEvents的接口定义。
原始的接口被定义为dispInterface,我们需要修改成继承于IUnknown接口,从而减少接口函数的数量。
interface _IAddEvents : IUnknown { [id(1), helpstring("method ExecutionOver")] HRESULT ExecutionOver(int Result); };5、实现连接点方法.
选中CAdd类,右击,选中添加->添加连接点菜单项.(见上图)
此时出现了上面的类,这个类将关心COM对象如何调用客户端接口。
接下来实现Add方法
STDMETHODIMP CAdd::Add(int a, int b){ // TODO: 在此添加实现代码 // 做一下延迟处理 Sleep(1000); // 触发执行完毕命令 Fire_ExecutionOver(a+b); return S_OK;}
6、发布。自动完成注册.
7、编写客户端来调用带连接点事件的COM
客户端测试后出现如下问题
/*
CoCreateInstance提示找不到接口点 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 待博客更新更修改这个BUG */ hr =pAdd.CoCreateInstance(CLSID_Add);
======================
2012-03-25补充以下解决上述BUG方法:
通过regsvrce.exe注册我们的dll.
regsvrce.exe可到我的资源里下载:
<<regsvrce.rar>>
这里还推荐大家参考我的另一篇文章