转载请标明是引用于 http://blog.csdn.net/chenyujing1234
例子代码:(包括客户端与服务端)
http://www.rayfile.com/zh-cn/files/de82908f-7309-11e1-9db1-0015c55db73d/
接着我的上一篇文章可连接点对象及示例(一),,接下来我们来创建一个连接点的示例。
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_DCOM
DECLARE_REGISTRY_RESOURCEID(IDR_ADD)
#endif
改为
//#ifndef _CE_DCOM
DECLARE_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>>
这里还推荐大家参考我的另一篇文章