没有合适的资源?快使用搜索试试~ 我知道了~
首页COM组件设计入门:从文件存储的演变看技术发展
COM组件设计入门:从文件存储的演变看技术发展
需积分: 0 0 下载量 120 浏览量
更新于2024-07-26
收藏 4.61MB PDF 举报
"COM组件设计与应用"是一篇针对有编程基础的COM初学者和理解者的教程,由作者杨老师撰写。文章以轻松幽默的方式回顾了作者学习COM技术的过程,从一开始的困惑到最后的深入理解,强调了技术进步和社会需求的关系。COM技术的核心起源于文件的存储需求。在Windows平台上,微软开发组件技术是为了满足用户对不同类型的文件处理,如非结构化的文本文件(如记事本中的文字),标准结构化文件(如电子表格中的数据),以及自定义结构化的程序数据。 文章首先讲述了COM(对象链接和嵌入)的起源,指出这种技术的发展并非偶然,而是社会需求驱动的结果。例如,通过记事本和电子表格程序的例子,展示了文件存储如何从简单文本到复杂数据结构的变化。非结构化文件便于用户自由编辑,而标准结构化文件则提供了预设的数据组织形式,自定义结构化的文件则允许程序员根据程序需求创建特定的存储格式。 在实际应用中,COM组件允许不同的应用程序之间共享和交换数据,增强了软件的互操作性。它通过组件对象模型(COM Objects)实现,使得开发者可以创建可重用的对象,这些对象可以被其他程序调用和嵌入,形成一种模块化和松耦合的编程模式。 文章的写作背景,即作者在经历了反复阅读和理解COM技术书籍后的感悟,体现了学习新技术时的曲折过程,同时也表达了作者希望通过分享自己的经验,帮助其他开发者避免重复踩过的坑,促进VCKBASE社区的成长和中国软件事业的发展。 总结来说,"COM组件设计与应用"系列将深入探讨COM技术的原理、设计方法和实际应用,对于想要理解和使用COM技术的读者来说,这是一个实用且深入的指南。
资源详情
资源推荐
留作 业啦......
1、IDispatch 接口的 IID 是多少?(哎~~~ 笨笨,在源程序中,用鼠标右键执行Go to definition 呀)
2、IPicture 接口有几个函数?功能是什么?(别玩了!你多大了?想不想在程序中显示 JPG 图像呀,看
MSDN
想知道为什么COM函数总是返回 HRESULT 吗?想知道如何使用 BSTR、VARIANT 吗?想知道 COM 中
应该
道如何使用 UNICODE 吗?......恩~~~,我现在不能告诉你,我现在告诉你,怕你印象不深!且听下回分解
......
注1:CLSID = Class ID 上回书已经介绍了把CLSID写入复合文件的函数:WriteClassStg()、
IStorage::SetClass()
注2:GUID 全局唯一标示符,CLSID/IID 其实是借用了GUID的概念。
注3:ProgID = Program ID,等价于 CLSID, 是用字符串表示的。
注4:注册表子键 ProgID 和 VersionIndependentProgID 分别表示真正的 ProgID 和版本无关的 ProgID。
比如在我
Excel,它的 ProgID = "Excel.Application.9",而 VersionIndependentProgID = "Excel.Application"。
注5:COM 组件的内存管理,见后续的文章。
注6:Interface = 接口,以前微软不叫它接口,而叫协议Protocol。其实我 到认为这个词更贴切一些。
注7:IUnknown 这个名字起的好,居然叫“我不知道”:-),它的 IID 叫 IID_IUnknown,如果用注册表样
式表示
{00000000-0000-0000-C000-000000000046}。
注8:TLB是由一个描述接口的文件 IDL 经过编译产生的。IDL 的说明,见后续的文章吧。
注9:IPersistStorage 是用复合文件的存储(Storage)功能来保存/读取数据用的一个接口。
注10:IPersistStreamInit 是用复合文件的流(Stream)功能来保存/读取数据用的一个接口。
注11:拜拜了您那 = 英语北京话,再见。
嵌入式
linux
工程师没毕业
-
就遭日本企业疯抢 嵌入式人才稀缺
东方标准嵌入式linux赴日班年薪35万 www.oristand.com
Google 提供的广告
在本网站刊登广告
最新评论 [发表评论] [文章投稿] 查看所有评论 推荐给好友 打印
一口气看完了两篇——
太奇妙了!太精彩了!怎一个“爽”字了得!
Dear Teacher Yang,
You done a great job! ( jinglecat 发表于 2007-10-10 21:05:00)
如果您出书,我将会成为您的第一个读者,支持...
..................... ( ik662 发表于 2007-10-2 1:01:00)
相当的精彩 ( zzw820626 发表于 2007-9-26 10:31:00)
不得不顶你! ( qurqur 发表于 2007-8-8 17:18:00)
写的真好,比参考书入门好多了 ( zdd_9804 发表于 2007-7-12 11:10:00)
继续顶,不顶不痛快,死了都要顶!! ( zt00 发表于 2007-7-10 15:36:00)
真是好人。谢谢! ( summoneral 发表于 2007-5-29 15:31:00)
谢谢杨老师的文章,读了很舒服。
真是高人 ( yiqiu 发表于 2007-2-8 12:11:00)
页码,8/9VC知识库文章 - COM 组件设计与应用(二)——GUID 和 接口
2007-11-21http://www.vckbase.com/document/viewdoc/?id=1485
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
版权所有
©
2006 VC知识库
真是高人,顶 !!! ( chinawsb 发表于 2007-1-15 23:57:00)
真不知该怎么说你好了,顶吧! ( yzzm521 发表于 2006-12-21 14:39:00)
.......................................................
More...
页码,9/9VC知识库文章 - COM 组件设计与应用(二)——GUID 和 接口
2007-11-21http://www.vckbase.com/document/viewdoc/?id=1485
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
::首页
>>
文档中心
>>
在线杂志
>>
COM技术(COM/DCOM/COM+)
[ 在线杂志 第
43期
]
[ 原创文档 本文适合初级读者 已阅读55109次 ]
COM组件设计与应用(三)
数据类型
作者:杨老师
一、前言
上回书介绍了GUID、CLSID、IID和接口的概念。本回的重点是介绍 COM 中的数据类型。咋还不介绍组
件程序的
骤呀?咳......别着急,别着急!孔子曰:“饭要一口一口地吃”;老子语:“心急吃不了热豆腐”,孙子云:“走一
步
吧” ...... 先掌握必要的知识,将来写起程序来才会得心应手也:-)
走入正题之前,请大家牢牢记住一条原则:COM 组件是运行在分布式环境中的。比如,你写了一个组
件程序
EXE),那么使用者可能是在本机的某个进程内加载组件(INPROC_SERVER);也可能是从另一个进程中调用
组
(LOCAL_SERVER);也可能是在这台计算机上调用地球那边计算机上的组件(REMOTE_SERVER)。
所以在理解和
时候,要时时刻刻想起这句话。快!拿出小本本,记下来!
二、HRESULT 函数返回值
每个人在做程序设计的时候,都有他们各自的哲学思想。拿函数返回值来说,就有好多种形式。
如此纷繁复杂的返回值,如此含义多变的返回值,使得大家在学习和使用的过程中,增加了额外的困难。
好了
函数 返回值 返回值信息
double sin(double) 浮点数值 计算正玄值
BOOL DeleteFile(LPCTSTR) 布尔值 文件删除是否成功。如失败,需要GetLastError()
才能取得失
void * malloc(size_t) 内存指针 内存申请,如果失败,返回空指针 NULL
LONG RegDeleteKey
(HKEY,LPCTSTR)
整数 删除注册表项。0表示成功,非0失败,同时这个值
就反映了失
UINT DragQueryFile
(HDROP,UINT,LPTSTR,UINT)
整数
取得拖放文件信息。以不同的参数调用,则返回不同的含义
一会儿表示文件个数,一会儿表示文件名长度,一会儿
表示字符
...... ...... ... ...... ......
页码,1/8VC知识库文章 - COM 组件设计与应用(三)——数据类型
2007-11-21http://www.vckbase.com/document/viewdoc/?id=1488
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
设计规范终于对他们进行了统一。组件API及接口指针中,除了IUnknown::AddRef()和IUnknown::Release()
两
其它所有的函数,都以 HRESULT 作为返回值。大家想象一个组件的接口函数比如叫Add(),完成2个整数
的加法
言中,我们可以如下定义:
还记得刚才我们说的原则吗?COM 组件是运行在分布式环境中的。也就是说,这个函数可能运行在“地球
另
机上,既然运行在那么遥远的地方,就有可能出现服务器关机、网络掉线、运行超时、对方不在服务区......等
异
个加法函数,除了需要返回运算结果以外,还应该返回一个值------函数是否被正常执行了。
如果函数正常执行,则返回 S_OK,同时真正的函数运行结果则通过参数指针返回。如果遇到了异常情况,
则
过判断,会返回相应的错误值。常见的返回值有:
图一、HRESULT 的结构
HRESULT 其实是一个双字节的值,其最高位(bit)如果是0表示成功,1表示错误。具体参见 MSDN 之"
Structure of COM
long Add( long n1, long n2 )
{
return n1 + n2;
}
HRESULT Add( long n1, long n2, long *pSum )
{
*pSum = n1 + n2;
return S_OK;
}
HRESULT 值 含义
S_OK 0x00000000 成功
S_FALSE 0x00000001 函数成功执行完成,但返回时出现错误
E_INVALIDARG 0x80070057 参数有错误
E_OUTOFMEMORY 0x8007000E 内存申请错误
E_UNEXPECTED 0x8000FFFF 未知的异常
E_NOTIMPL 0x80004001 未实现功能
E_FAIL 0x80004005 没有详细说明的错误。一般需要取得 Rich Error 错误信息(注1)
E_POINTER 0x80004003 无效的指针
E_HANDLE 0x80070006 无效的句柄
E_ABORT 0x80004004 终止操作
E_ACCESSDENIED 0x80070005 访问被拒绝
E_NOINTERFACE 0x80004002 不支持接口
页码,2/8VC知识库文章 - COM 组件设计与应用(三)——数据类型
2007-11-21http://www.vckbase.com/document/viewdoc/?id=1488
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
Error Codes"说明。我们在程序中如果需要判断返回值,则可以使用比较运算符号;switch开关语句;
也可以使用
宏:
三、UNICODE
计算机发明后,为了在计算机中表示字符,人们制定了一种编码,叫ASCII码。ASCII码由一个字节中的7位
(
围是0x00 - 0x7F 共128个字符。他们以为这128个数字就足够表示abcd....ABCD....1234 这些字符了。
咳......说英语的人就是“笨”!后来他们突然发现,如果需要按照表格方式打印这些字符的时候,缺少了“
制表符
扩展了ASCII的定义,使用一个字节的全部8位(bit)来表示字符了,这就叫扩展ASCII码。范围是0x00 - 0xFF
共
咳......说中文的人就是聪明!中国人利用连续2个扩展ASCII码的扩展区域(0xA0以后)来表示一个汉字,
该
叫GB-2312。后来,日文、韩文、阿拉伯文、台湾繁体(BIG-5)......都使用类似的方法扩展了本地字符集的定
义
称为 MBCS 字符集(多字节字符集)。这个方法是有缺陷的,因为各个国家地区定义的字符集有交集,
因此使用
件,就不能在BIG-5的环境下运行(显示乱码),反之亦然。
咳......说英语的人终于变“聪明”一些了。为了把全世界人民所有的所有的文字符号都统一进行编码,
于是制定了
UNICODE标准字符集。UNICODE 使用2个字节表示一个字符(unsigned shor int、WCHAR、_wchar_t、
OLECHAR)
于好啦,全世界任何一个地区的软件,可以不用修改地就能在另一个地区运行了。虽然我用 IE 浏览日本网站,
显
识的日文文字,但至少不会是乱码了。UNICODE 的范围是 0x0000 - 0xFFFF 共6万多个字符,其中光汉
字就占用了
个。嘿嘿,中国人赚大发了:0)
在程序中使用各种字符集的方法:
在上面的例子中,T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它
表示使用一
间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集那?嘿嘿......编译的
时
设置条件编译的方式是:VC6中,"Project\Settings...\C/C++卡片 Preprocessor definitions" 中添加或修改
_
_UNICODE;VC.NET中,"项目\属性\配置属性\常规\字符集"然后用组合窗进行选择。使用 T 类型,
是非常好的
推荐!
四、BSTR
COM 中除了使用一些简单标准的数据类型外(注2),字符串类型需要特别重点地说明一下。还记得原
则吗
是运行在分布式环境中的。通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。你想想,系
统
HRESULT hr = 调用组件函数;
if( SUCCEEDED( hr ) ){...} // 如果成功
......
if( FAILED( hr ) ){...} //
如果失败
......
const char * p = "Hello"; // 使用 ASCII 字符集
const char * p = "你好"; // 使用 MBCS 字符集,由于 MBCS 完全兼容 ASCII,多数情况下,我们并
不
LPCSTR p = "Hello,
你好
"; //
意义同上
const WCHAR * p = L"Hello,你好"; // 使用 UNICODE 字符集
LPCOLESTR p = L"Hello,你好"; // 意义同上
// 如果预定义了_UNICODE,则表示使用UNICODE字符集;如果定义了_MBCS,则表示使用 MBCS
const TCHAR * p = _T("Hello,你好");
LPCTSTR p = _T("Hello,你好"); // 意义同上
页码,3/8VC知识库文章 - COM 组件设计与应用(三)——数据类型
2007-11-21http://www.vckbase.com/document/viewdoc/?id=1488
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
剩余162页未读,继续阅读
yin5204
- 粉丝: 0
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功