COM 组件设计与应用(一)起源及复合文件

如何分析与利用WORD溢出漏洞(科普)  众所周知,溢出漏洞从应用形式上可分为远程服务溢出漏洞和客户端(本地)溢出漏洞两类。远程服务溢出漏洞大家很熟悉了,红色代码、冲击波、振荡波等蠕虫都利用了此类漏洞,漏洞的调试和利用有相应的一套方法,前面的文章也有过实例介绍;至于客户端溢出漏洞,这种说法是我暂时从网络上借用来的,IE、OutLook、Firefox、MSN等存在的漏洞是例子,扩展一下,Office、Acrobar Reader等软件存 阅读详情

COM 组件设计与应用(一)
起源及复合文件

作者:杨老师

一、前言

  公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。功夫不负有心人,终于买到了我的第一本COM书《OLE2 高级编程技术》,这本800多页的大布头花费了我1/5的月工资呀......于是开始日夜耕读.....
功夫不负有心人,我坚持读完了全部著作,感想是:这本书,在说什么呐?
功夫不负有心人,我又读完了一遍大布头,感想是:咳~~~,没懂!
功夫不负有心人,我再,我再,我再读 ... 感想是:哦~~~,读懂了一点点啦,哈哈哈。
...... ......
功夫不负有心人,我终于,我终于懂了。
800页的书对现在的我来说,其实也就10几页有用。到这时候才体会出什么叫“书越读越薄”的道理了。到后来,能买到的书也多了,上网也更方便更便宜了......

  为了让VCKBASE上的朋友,不再经历我曾经的痛苦、不再重蹈我“无头苍蝇”般探索的艰辛、为了VCKBASE的蓬勃发展、为了中国软件事业的腾飞(糟糕,吹的太也高了)......我打算节约一些在 BBS 上赚分的时间,写个系列论文,就叫“COM组件设计与应用”吧。今天是第一部分——起源。

二、文件的存储

  传说350年前,牛顿被苹果砸到了头,于是发现了万有引力。但到了二十一世纪的现在,任何一个技术的发明和发展,已经不再依靠圣人灵光的一闪。技术的进步转而是被社会的需求、商业的利益、竞争的压力、行业的渗透等推动的。微软在Windows平台上的组件技术也不例外,它的发明,有其必然因素。什么是这个因素那?答案是——文件的存储。
  打开记事本程序,输入了一篇文章后,保存。——这样的文件叫“非结构化文件”;
  打开电子表格程序,输入一个班的学生姓名和考试成绩,保存。——这样的文件叫“标准结构化文件”;
  在我们写的程序中,需要把特定的数据按照一定的结构和顺序写到文件中保存。——这样的文件叫“自定义结构化文件”;(比如 *.bmp 文件)
  以上三种类型的文件,大家都见的多了。那么文件存储就依靠上述的方式能满足所有的应用需求吗?恩~~~,至少从计算机发明后的50多年来,一直是够用的了。嘿嘿,下面看看商业利益的推动作用,对文件 的存储形式产生了什么变化吧。30岁以上的朋友,我估计以前都使用过以下几个著名的软件:WordStar(独霸DOS下的英文编辑软件),WPS(裘伯君写的中文编辑软件,据说当年的市场占有率高达90%,各种计算机培训班的必修课程),LOTUS-123(莲花公司出品的电子表格软件)......
微软在成功地推出 Windows 3.1 后,开始垂涎桌面办公自动化软件领域。微软的 OFFICE 开发部门,各小组分别独立地开发了 WORD 和 EXCEL 等软件,并采用“自定义结构”方式,对文件进行存储。在激烈的市场竞争下,为了打败竞争对手,微软自然地产生了一个念头------如果我能在 WORD 程序中嵌入 EXCEL,那么用户在购买了我 WORD 软件的情况下,不就没有必要再买 LOTUS-123 了吗?!“恶毒”(中国微软的同志们看到了这个词,不要激动,我是加了引号的呀)的计划产生后,他们开始了实施工作,这就是 COM 的前身 OLE 的起源(注3)。但立刻就遇到了一个严重的技术问题:需要把 WORD 产生的 DOC 文件和 EXCEL 产生的 XLS 文件保存在一起。
 

方案

优点

缺点

建立一个子目录,把 DOC、XLS 存储在这同一个子目录中。数据隔离性好,WORD 不用了解 EXCEL 的存储结构;容易扩展。结构太松散,容易造成数据的损坏或丢失。
不易携带。
修改文件存储结构,在DOC结构基础上扩展出包容 XLS 的结构。结构紧密,容易携带和统一管理。WORD 的开发人员需要通晓 EXCEL 的存储格式;缺少扩展性,总不能新加一个类型就扩展一下结构吧?!

以上两个方案,都有严重的缺陷,怎么解决那?如果能有一个新方案,能够合并前两个方案的优点,消灭缺点,该多好呀......微软是作磁盘操作系统起家的,于是很自然地他们提出了一个非常完美的设计方案,那就是把磁盘文件的管理方式移植到文件中了------复合文件,俗称“文件中的文件系统”。连微软当年都没有想到,就这么一个简单的想法,居然最后就演变出了 COM 组件程序设计的方法。可以说,复合文件是 COM 的基石。下图是磁盘文件组织方式与复合文件组织方式的类比图:

图一、左侧表示一个磁盘下的文件组织方式,右侧表示一个复合文件内部的数据组织方式。

三、复合文件的特点

  1. 复合文件的内部是使用指针构造的一棵树进行管理的。编写程序的时候要注意,由于使用的是单向指针,因此当做定位操作的时候,向后定位比向前定位要快;
  2. 复合文件中的“流对象”,是真正保存数据的空间。它的存储单位为512字节。也就是说,即使你在流中只保存了一个字节的数据,它也要占据512字节的文件空间。啊~~~,这也太浪费了呀?不浪费!因为文件保存在磁盘上,即使一个字节也还要占用一个“簇”的空间那;
  3. 不同的进程,或同一个进程的不同线程可以同时访问一个复合文件的不同部分而互不干扰;
  4. 大家都有这样的体会,当需要往一个文件中插入一个字节的话,需要对整个文件进行操作,非常烦琐并且效率低下。而复合文件则提供了非常方便的“增量访问”能力;
  5. 当频繁地删除文件,复制文件后,磁盘空间会变的很零碎,需要使用磁盘整理工具进行重新整合。和磁盘管理非常相似,复合文件也会产生这个问题,在适当的时候也需要整理,但比较简单,只要调用一个函数就可以完成了。

四、浏览复合文件

  VC6.0 附带了一个工具软件“复合文件浏览器”,文件名是“vc目录/Common/Tools/DFView.exe”。为了方便使用该程序,可以把它加到工具(tools)菜单中。方法是:Tools/Customize.../Tools卡片中增加新的项目。运行 DFView.exe,就可以打开一个复合文件进行观察了(注4)。但奇怪的是,在 Microsoft Visual Studio .NET 2003 中,我反而找不到这个工具程序了,汗!不过这恰好提供给大家一个练习的机会,在你阅读完本篇文章并掌握了编程方法后,自己写一个“复合文件浏览编辑器”程序,又练手了,还有实用的价值。

五、复合文件函数

  复合文件的函数和磁盘目录文件的操作非常类似。所有这些函数,被分为3种类型:WIN API 全局函数,存储 IStorage 接口函数,流 IStream 接口函数。什么是接口?什么是接口函数?以后的文章中再陆续介绍,这里大家只要把“接口”看成是完成一组相关操作功能的函数集合就可以了。
 

WIN API 函数

功能说明

StgCreateDocfile()建立一个复合文件,得到根存储对象
StgOpenStorage()打开一个复合文件,得到根存储对象
StgIsStorageFile()判断一个文件是否是复合文件

 

IStorage 函数

功能说明

CreateStorage()在当前存储中建立新存储,得到子存储对象
CreateStream()在当前存储中建立新流,得到流对象
OpenStorage()打开子存储,得到子存储对象
OpenStream()打开流,得到流对象
CopyTo()复制存储下的所有对象到目标存储中,该函数可以实现“整理文件,释放碎片空间”的功能
MoveElementTo()移动对象到目标存储中
DestoryElement()删除对象
RenameElement()重命名对象
EnumElements()枚举当前存储中所有的对象
SetElementTimes()修改对象的时间
SetClass()在当前存储中建立一个特殊的流对象,用来保存CLSID(注5)
Stat()取得当前存储中的系统信息
Release()关闭存储对象
 

IStream 函数

功能说明

Read()从流中读取数据
Write()向流中写入数据
Seek()定位读写位置
SetSize()设置流尺寸。如果预先知道大小,那么先调用这个函数,可以提高性能
CopyTo()复制流数据到另一个流对象中
Stat()取得当前流中的系统信息
Clone()克隆一个流对象,方便程序中的不同模块操作同一个流对象
Release()关闭流对象
 
WIN API 补充函数功能说明
WriteClassStg()写CLSID到存储中,同IStorage::SetClass()
ReadClassStg()读出WriteClassStg()写入的CLSID,相当于简化调用IStorage::Stat()
WriteClassStm()写CLSID到流的开始位置
ReadClassStm()读出WriteClassStm()写入的CLSID
WriteFmtUserTypeStg()写入用户指定的剪贴板格式和名称到存储中
ReadFmtUserTypeStg()读出WriteFmtUserTypeStg()写入的信息。方便应用程序快速判断是否是它需要的格式数据。
CreateStreamOnHGlobal()内存句柄 HGLOBAL 转换为流对象
GetHGlobalFromStream()取得CreateStreamOnHGlobal()调用中使用的内存句柄

为了让大家快速地浏览和掌握基本方法,上面所列表的函数并不是全部,我省略了“事务”函数和未实现函数部分。更全面的介绍,请阅读 MSDN。
下面程序片段,演示了一些基本函数功能和调用方法。
示例一:建立一个复合文件,并在其下建立一个子存储,在该子存储中再建立一个流,写入数据。

void SampleCreateDoc()
{
	::CoInitialize(NULL);	// COM 初始化
				// 如果是MFC程序,可以使用AfxOleInit()替代

	HRESULT hr;		// 函数执行返回值
	IStorage *pStg = NULL;	// 根存储接口指针
	IStorage *pSub = NULL;	// 子存储接口指针
	IStream *pStm = NULL;	// 流接口指针

	hr = ::StgCreateDocfile(	// 建立复合文件
		L"c://a.stg",	// 文件名称
		STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE,	// 打开方式
		0,		// 保留参数
		&pStg);		// 取得根存储接口指针
	ASSERT( SUCCEEDED(hr) );	// 为了突出重点,简化程序结构,所以使用了断言。
				// 在实际的程序中则要使用条件判断和异常处理

	hr = pStg->CreateStorage(	// 建立子存储
		L"SubStg",	// 子存储名称
		STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE,
		0,0,
		&pSub);		// 取得子存储接口指针
	ASSERT( SUCCEEDED(hr) );

	hr = pSub->CreateStream(	// 建立流
		L"Stm",		// 流名称
		STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE,
		0,0,
		&pStm);		// 取得流接口指针
	ASSERT( SUCCEEDED(hr) );

	hr = pStm->Write(		// 向流中写入数据
		"Hello",		// 数据地址
		5,		// 字节长度(注意,没有写入字符串结尾的/0)
		NULL);		// 不需要得到实际写入的字节长度
	ASSERT( SUCCEEDED(hr) );

	if( pStm )	pStm->Release();// 释放流指针
	if( pSub )	pSub->Release();// 释放子存储指针
	if( pStg )	pStg->Release();// 释放根存储指针

	::CoUninitialize()		// COM 释放
				// 如果使用 AfxOleInit(),则不调用该函数
}


图二、运行示例程序一后,使用 DFView.exe 打开观察复合文件的效果图

示例二:打开一个复合文件,枚举其根存储下的所有对象。

#include <atlconv.h>	// ANSI、MBCS、UNICODE 转换

void SampleEnum() 
{	// 假设你已经做过 COM 初始化了

	LPCTSTR lpFileName = _T( "c://a.stg" );
	HRESULT hr;
	IStorage *pStg = NULL;
	
	USES_CONVERSION;				// (注6)
	LPCOLESTR lpwFileName = T2COLE( lpFileName );	// 转换T类型为宽字符
	hr = ::StgIsStorageFile( lpwFileName );	// 是复合文件吗?
	if( FAILED(hr) )	return;

	hr = ::StgOpenStorage(			// 打开复合文件
		lpwFileName,			// 文件名称
		NULL,
		STGM_READ | STGM_SHARE_DENY_WRITE,
		0,
		0,
		&pStg);				// 得到根存储接口指针

	IEnumSTATSTG *pEnum=NULL;	// 枚举器
	hr = pStg->EnumElements( 0, NULL, 0, &pEnum );
	ASSERT( SUCCEEDED(hr) );

	STATSTG statstg;
	while( NOERROR == pEnum->Next( 1, &statstg, NULL) )
	{
		// statstg.type 保存着对象类型 STGTY_STREAM 或 STGTY_STORAGE
		// statstg.pwcsName 保存着对象名称
		// ...... 还有时间,长度等很多信息。请查看 MSDN

		::CoTaskMemFree( statstg.pwcsName );	// 释放名称所使用的内存(注6)
	}
	
	if( pEnum )	pEnum->Release();
	if( pStg )	pStg->Release();
}

六、小结

  复合文件,结构化存储,是微软组件思想的起源,在此基础上继续发展出了持续性、命名、ActiveX、对象嵌入、现场激活......一系列的新技术、新概念。因此理解和掌握 复合文件是非常重要的,即使在你的程序中并没有全面使用组件技术,复合文件技术也是可以单独被应用的。祝大家学习快乐,为社会主义软件事业而奋斗:-)

留作业啦......
作业1:写个小应用程序,从 MSWORD 的 doc 文件中,提取出附加信息(作者、公司......)。
作业2:写个全功能的“复合文件浏览编辑器”。

注1:踅摸(xuemo),动词,北方方言,寻找搜索的意思。
注2:问:为什么不上网查资料学习?
答:开什么国际玩笑!在那遥远的1995年代,我的500块工资,不吃不喝正好够上100小时的Internet网。
注3:OLE,对象的连接与嵌入。
注4:可以用 DFView.exe 打开 MSWORD 的 DOC 文件进行复合文件的浏览。但是该程序并没有实现国际化,不能打开中文文件名的复合文件,因此需要改名后才能浏览。
注5:CLSID,在后续的文章中介绍。
注6:关于 COM 中内存使用的问题,在后续的文章中介绍。

COM结构化存储(也称“OLE结构化存储”)是微软在Windows操作系统上开发的一种技术,以在一个文件内存储层次化的数据。 结构化存储是为了解决在一个文件中存放多个数据对象的本质性困难。当修改一个对象从而改变其尺寸时,如果这些对象在文件内是顺序存放的,则被修改对象的尺寸扩大时所有在其后的对象都需要向后移动以腾出空间,被修改对象缩小尺寸时所有在其后的对象都需要向前移动。这样的困难有很多种办法应对,但应用程序开发者并不希望处理这样低层次的二进制文件格式问题。结构化存储把文件系统的概念引入到文件内部。在文件内部构造一个树状层次结构。由存储对象和流对象构成。根节点为根存储,根存储下面可以有子存储或流对象。 阅读详情

相关推荐

DFVIEW.EXE

可以查看QQ聊天记录MsgEx.db的文件层次结构。 注意:打开MsgEx.db的路径必须是英文,(含有中文字符将无法打开)。

结构化存储和OLE对象

1 引言 目前,传统的二层C/S(Client/Server)结构应用软件已发展为多层结构的分布式应用 系统[2]。为了改善系统的工作效率以及提高系统的伸缩性,很多软件开发人员都把服务器 上的一些基本数据分发到各个客户机上。这种工作模式的优点是显著的,因为它减少了那 些非实时数据(如员工表、产品数据表等)在网络上的流动,并且在网络瘫痪时,各个客 户机仍然可以...

aimang9690的博客 662

VC6.0工具DFView

VC6.0工具集之一,Window NT DocFile Viewer - Vision2.0

COM 组件设计与应用(一)——起源及复合文件

作者:杨老师一、前言  公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。功夫不负有心人,终于买到了我的第一本COM书《OLE2 高级编程技术》,这

junchieh 607

[misc]智能车协议分析:2020网鼎杯青龙组misc_teslaaaaa_wp

[misc]智能车协议分析:2020网鼎杯青龙组misc_teslaaaaa_wp 文章目录[misc]智能车协议分析:2020网鼎杯青龙组misc_teslaaaaa_wp分析log文件格式分析协议组成UDS网络传输层UDS统一诊断服务协议分析文件提取文件逆向flag计算参考链接: teslaaaaa这道题是青龙组被做出来的题目中做出来人数最少的,直到比赛快结束才有第一个人做出来,怎么说,难并不是因为脑洞大,讲道理这道题是一道好题,我当时也是肝了一天没做出来,我倒是把文件提取出来了,奈何比赛时间已经接近尾

Breeze的博客 1万+

EverOS:为AI智能体构建长期记忆系统的完整指南

长期记忆是AI智能体实现持续学习和自我演进的核心能力,它通过结构化存储和关联检索历史交互信息,使智能体能够跨越单次对话的局限。其技术原理通常涉及向量数据库、记忆提取算法和知识图谱等组件,用于对非结构化对话内容进行编码、组织和索引。这一能力的技术价值在于显著提升了智能体的个性化服务水平、任务完成连贯性以及从经验中学习的能力,是实现真正“智能”伙伴的关键。在应用场景上,长期记忆系统广泛应用于个性化聊天伴侣、持续学习的编程助手、游戏NPC角色塑造以及客户服务机器人等领域。本文以EverOS为例,深入解析了其提供的

weixin_28679635的博客 449

COM 组件设计与应用(一)--起源及复合文件

 一、前言  公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思:“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。功夫不负有心人,终于买到了我的第一本COM书《OLE2高级编程

Welcom to zougangx's blog 1432

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1687

【转载】COM组件设计与应用(一)——起源及复合文件

一、前言  公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。功夫不负有心人,终于买到了我的第一本COM书《OLE2 高级编程技术》,这本8...

weixin_30840573的博客 143

无人驾驶-2024-09-智能驾驶与机器视觉09:视觉与多传感器融合

从本章开始,我们将详细介绍视觉与多传感器融合技术。自动驾驶中常用的传感器都有其优势和局限性,单一传感器无法应对复杂的驾驶场景。多传感器融合技术旨在综合利用不同的传感器优势,提升感知的精度和鲁棒性。本章首先介绍多传感器融合的相关概念,之后详细介绍典型的融合方法。

u013250861的博客 593

Modbus RTU 详解 + FreeMODBUS移植(附项目源码)

本文全面解析Modbus RTU通信协议,详细介绍其报文格式、功能码定义及典型应用场景,并手把手指导如何将FreeMODBUS协议栈移植到嵌入式平台。内容涵盖从底层硬件驱动配置、协议栈移植到主机/从机通信测试的全流程,重点讲解移植过程中的常见问题及解决方案。文章最后提供经过实测的完整项目源码,帮助开发者快速实现稳定的Modbus RTU通信功能。

Bit_Dong的博客 2927

COM组件设计与应用(一)——起源及复合文件

本文摘自:http://blog.vckbase.com/teacheryang/archive/2005/06/27/8883.html 一、前言   公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的

jiangqin115的专栏 1133

【一看就会】Autoware.universe中静态绕障路线的生成逻辑

在路径行为规划中,前期根据地图和起点终点,生成了一组连续可行的路径段序列(lanelets),然后后续路径行为规划,又会进行起始点,终止点,避障绕障路径的路径规划,并且会调用route_handler中的函数,进行中心线生成,最后生成路径,后续再给速度行为规划进行速度规划。在autoware.universe的规划中,是基于规则的规划,而其中的规则又是为了解决不同场景的。而这些场景,大部分是为了解决路上障碍物(静态、动态、行人、车辆等等)。

weixin_48386130的博客 321

COM 组件设计与应用(一) 起源及复合文件

作者:杨老师   原文:http://www.vckbase.com/document/viewdoc/?id=1483  一、前言   公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在

c++自学 726

Megatron-LM从头训练大语言模型:并行策略图示【Tensor并行、Pipeline并行、Data并行、Sequence并行、virtual_pipeline并行、Context并行】

节点包含的层每GPU的参数内存每GPU的激活内存节点0Stage 0层1-1212层参数/2 (TP切分)8k序列激活 (CP切分)节点1Stage 1层13-2412层参数/2 (TP切分)8k序列激活 (CP切分)节点2Stage 2层25-3612层参数/2 (TP切分)8k序列激活 (CP切分)节点3Stage 3层37-4812层参数/2 (TP切分)8k序列激活 (CP切分)负载均衡:每个节点处理相同数量的层(12层)内存优化。

u013250861的博客 285

windows server 2012 AD 活动目录部署系列(十一)安装证书服务器(ADCS)

本篇博文介绍如何在AD域控上安装证书服务器,本实验域环境:yun.com。 步骤如下: 1、打开“服务器管理器”,点击“添加角色和功能”,如下图: 2、点击下一步, 3、点击下一步, 4、点击下一步, 5、点击“Active Directory证书服务”,弹出功能选择,点击"添加功能",如下图,

白昼的技术专栏 2万+

COM组件设计与应用(一)起源及复合文件

一.前言      能免则免,杨老师的幽默我就省略了哈,O(∩_∩)O~。二.文件的存储   传说350年前,牛顿被苹果砸到了头,于是发现了万有引力。但到了二十一世纪的现在,任何一个技术的发明和发展,已经不再依靠圣人灵光的一闪。技术的进步转而是被社会的需求、商业的利益、竞争的压力、行业的渗透等推动的。微软在Windows平台上的组件技术也不例外,它的发明,有其必然因素。什么是这个因素那?答

skywind1983的专栏 605

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

COM 组件设计与应用(一)起源及复合文件[转贴]

一、前言  公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。功夫不负有心人,终于买到了我的第一本COM书《OLE2 高级编程技术》,这本800

梦回大唐 646

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

起源及复合文件-COM 组件设计与应用(一)

COM 组件设计与应用(一)起源及复合文件作者:杨老师一、前言  公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。功夫不负有心人,终于买到了我的第

da1505的专栏 457

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【转载】COM 组件设计与应用(一)——起源及复合文件

原文:http://vckbase.com/index.php/wv/1201.html  COM 组件设计与应用 系列文章:http://vckbase.com/index.php/piwz?&amp;p=1   一、前言 公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩...

weixin_33802505的博客 111
上一篇: ATL中从IDS载入字符串
下一篇: COM组件设计与应用(二)GUID 和 接口
cpusoft
博客等级 码龄22年 8粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值