可连接点对象及示例(二)

时间:2022-08-30 22:40:18
 

转载请标明是引用于 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

参考文章http://social.microsoft.com/Forums/fi-FI/windowsembeddedcezhchs/thread/7046a061-daf5-4b28-a738-0b619307403f

后把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>>

这里还推荐大家参考我的另一篇文章

Windows CE 系统进程外组件应用开发 .