COM 组件设计与应用(六) 下载源代码 二、建立 ATL 工程 STDMETHODIMP CFun::Add(long n1, long n2, long *pVal) { *pVal = n1 + n2; return S_OK; }这个太简单了,不再浪费“口条”。下面我们实现字符串连接的Cat()函数: STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) { int nLen1 = ::SysStringLen( s1 ); // s1 的字符长度 int nLen2 = ::SysStringLen( s2 ); // s2 的字符长度 *pVal = ::SysAllocStringLen( s1, nLen1 + nLen2 );// 构造新的 BSTR 同时把 s1 先保存进去 if( nLen2 ) { ::memcpy( *pVal + nLen1, s2, nLen2 * sizeof(WCHAR) ); // 然后把 s2 再连接进去 // wcscat( *pVal, s2 ); } return S_OK; }学生:上面的函数实现,完全是调用基本的 API 方式完成的。 老师:是的,说实话,的确比较烦琐。 学生:我们是用memcpy()完成连接第二个字符串功能的,那么为什么不用函数 wcscat()那? 老师:多数情况下可以,但你需要知道:由于BSTR包含有字符串长度,因此实际的BSTR字符串内容中是可以存储L''\0''的,而函数 wcscat() 是以L''\0''作为复制结束标志,因此可能会丢失数据。明白了吗? 学生:明白,明白。我看过《COM 组件设计与应用(三)之数据类型》后就明白了。那么老师,有没有简单一些的方法那? 老师:有呀,你看...... STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) { CComBSTR sResult( s1 ); sResult.AppendBSTR( s2 ); *pVal = sResult.Copy(); // *pVal = sResult.Detach(); return S_OK; }学生:哈哈,好!使用了 CComBSTR,这个就简单多了。CComBSTR::Copy()和CComBSTR::Detach()有什么区别? 老师:CComBSTR::Copy() 会制造一个 BSTR 的副本,另外CComBSTR::CopyTo()也有类似功能。而CComBSTR::Detach()是使对象与内部的 BSTR 指针剥离,这个函数由于没有复制过程,因此速度稍微快一点点。但要注意,一但剥离后,就不能再使用该对象啦。 学生:老师,您讲的太牛啦,我对您的敬仰如巍巍泰山,直入云霄...... 老师:STOP,STOP!留作业啦...... 1、自己先按照今天讲的内容写出这个组件; 2、不管你懂不懂,一定要去观察 IDL 文件,CPP 文件; 3、编译后,看都产生了些什么文件?如果是文本的文件,就打开看看; 4、下载本文的示例程序(vc.net 2003版本)编译运行,看看效果。然后预习一下示例程序中的调用方法; 学生:知道啦,快下课吧,我要上厕所,我都憋的不行了...... 老师:下课!别忘了顶我的帖子呀...... 六、小结 本回介绍第一个ATL组件程序的建立步骤,而如何使用该组件,敬请关注《COM 组件设计与应用(七)》。 注1:Apartment,系统通过隐藏的窗口消息来排队组件调用,因此我们可以暂时不考虑同步问题。注意,是暂时哈。 注2:双接口表示在一个接口中,同时支持自定义接口和 IDispatch 接口。以后,以后,以后就讲。因为双接口非常重要,我们以后会天天讲、夜夜讲、常常讲------简称“三讲”:) 注3:组件的重用方法有2个,聚合和包容。 注4:这些都是 IDL 文件中的概念,以后用到什么,就介绍什么。 |
最新评论 [发表评论] [文章投稿] | 查看所有评论 推荐给好友 打印 |
顶! 编译肯定能过 再检查检查 ( tfeitian 发表于 2005-10-4 20:41:00) 编译不过啊 ( HeroiNg 发表于 2005-9-1 16:59:00) 顶!顶!还是顶!杨老师文如其人啊!至于VC6中的MFC的内部类CString在VC7里成为共享类CString,大家心照不宣啊! ( mtsh 发表于 2005-8-7 13:19:00) .................. 服了 ( wjjssnew 发表于 2005-7-19 14:09:00) to wjjssnew: 怎么说我没有幽默感呢?技术文章的幽默应以准确为前提,而且与(五)相比,那一段文字丝毫没有改动,肯定是不太准确的("五"里面的这段话没有任何问题)。而且我个人很喜欢杨老师的文章,很生动、也很有幽默感,我只是觉得这里不太准确. ( localvar 发表于 2005-7-16 6:36:00) 太感谢了 ( duckbill_panpan 发表于 2005-7-14 21:58:00) 考虑周全, 心细之人哪~! ( NeverMindEx 发表于 2005-7-13 8:48:00) 咋就用的VC.NET 2003,哈!多谢周全的考虑! ( xmxjh 发表于 2005-7-12 21:22:00) To: 楼下的.. 哥们,你一点幽默感都没有!! ( wjjssnew 发表于 2005-7-12 19:33:00) 好像有个bug,在vs2003中,CString属于Shared Visual C++ Classe, 在atl和mfc中都有,用mfc的话要include<cstringt.h>,用atl的话include<atlstr.h>。所以就谈不上“悄悄地、秘密地、不要告诉别人(特别是别告诉微软),把 MFC 中的 CString 源码拿过来用;” ( localvar 发表于 2005-7-12 13:38:00) |