|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
前些天,在CSDN上看到了一个消息,说是net网页编程网页编程AJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。1、媒介
公元一九九五年某个夜黑风高的早晨,我的一名先生跟我说:“小杨呀,今后写程序就和搭积木一样啦。你从速进修一些OLE的手艺吧......”,事先我内心就沉思:“开甚么打趣?搭积木体例写程序?再过100年吧......”,但作为一位听话的勤学生,我入手下手在书店里“踅摸”(注1)有关OLE的书本(注2)。工夫不负故意人,终究买到了我的第一本COM书《OLE2初级编程手艺》,这本800多页的年夜布头消费了我1/5的月人为呀......因而入手下手昼夜耕读.....
工夫不负故意人,我保持读完了全体著作,感受是:这本书,在说甚么呐?
工夫不负故意人,我又读完了一遍年夜布头,感受是:咳~~~,没懂!
工夫不负故意人,我再,我再,我再读...感受是:哦~~~,读懂了一点点啦,哈哈哈。
............
工夫不负故意人,我终究,我终究懂了。
800页的书对如今的我来讲,实在也就10几页有效。到这时候候才体味出甚么叫“书越读越薄”的事理了。到厥后,能买到的书也多了,上彀也更便利更廉价了......
为了让VCKBASE上的伴侣,不再履历我已经的疾苦、不再重蹈我“无头苍蝇”般探究的艰苦、为了VCKBASE的兴旺开展、为了中国软件奇迹的起飞(糟,吹的太也高了)......我盘算勤俭一些在BBS上赚分的工夫,写个系列论文,就叫“COM组件计划与使用”吧。明天是第一部分——劈头。
2、文件的存储
传说350年前,牛顿被苹果砸到了头,因而发明了万有引力。但到了二十一世纪的如今,任何一个手艺的创造和开展,已不再依托贤人灵光的一闪。手艺的前进转而是被社会的需求、贸易的好处、合作的压力、行业的浸透等推进的。微软在Windows平台上的组件手艺也不破例,它的创造,有其一定要素。甚么是这个要素那?谜底是——文件的存储。
翻开记事本程序,输出了一篇文章后,保留。——如许的文件叫“非布局化文件”;
翻开电子表格程序,输出一个班的先生姓名和测验成就,保留。——如许的文件叫“尺度布局化文件”;
在我们写的程序中,必要把特定的数据依照必定的布局温柔序写到文件中保留。——如许的文件叫“自界说布局化文件”;(好比*.bmp文件)
以上三品种型的文件,人人都见的多了。那末文件存储就依托上述的体例能满意一切的使用需求吗?恩~~~,最少从盘算机创造后的50多年来,一向是够用的了。嘿嘿,上面看看贸易好处的推进感化,对文件的存储情势发生了甚么变更吧。30岁以上的伴侣,我估量之前都利用过以下几个出名的软件:WordStar(把持DOS下的英文编纂软件),WPS(裘伯君写的中文编纂软件,听说昔时的市场占据率高达90%,各类盘算机培训班的?课程),LOTUS-123(莲花公司出品的电子表格软件)......
微软在乐成地推出Windows3.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的基石。下图是磁盘文件构造体例与复合文件构造体例的类比图:
<br>
、左边暗示一个磁盘下的文件构造体例,右边暗示一个复合文件外部的数据构造体例。
3、复合文件的特性
- 复合文件的外部是利用指针机关的一棵树举行办理的。编写程序的时分要注重,因为利用的是单向指针,因而当作定位操纵的时分,向后定位比向前定位要快;
- 复合文件中的“流对象”,是真正保留数据的空间。它的存储单元为512字节。也就是说,即便你在流中只保留了一个字节的数据,它也要占有512字节的文件空间。啊~~~,这也太华侈了呀?不华侈!由于文件保留在磁盘上,即便一个字节也还要占用一个“簇”的空间那;
- 分歧的历程,或统一个历程的分歧线程能够同时会见一个复合文件的分歧部分而互不搅扰;
- 人人都有如许的体味,当必要往一个文件中拔出一个字节的话,必要对全部文件举行操纵,十分啰嗦而且效力低下。而复合文件则供应了十分便利的“增量会见”才能;
- 当频仍地删除文件,复制文件后,磁盘空间会变的很琐屑,必要利用磁盘收拾工具举行从头整合。和磁盘办理十分类似,复合文件也会发生这个成绩,在得当的时分也必要收拾,但对照复杂,只需挪用一个函数就能够完成了。
4、扫瞄复合文件
VC6.0附带了一个工具软件“复合文件扫瞄器”,文件名是“vc目次CommonToolsDFView.exe”。为了便利利用该程序,能够把它加到工具(tools)菜单中。办法是:ToolsCustomize...Tools卡片中增添新的项目。运转DFView.exe,就能够翻开一个复合文件举行察看了(注4)。但奇异的是,在MicrosoftVisualStudio.NET2003中,我反而找不到这个工具程序了,汗!不外这刚好供应给人人一个实习的时机,在你浏览完本篇文章并把握了编程办法后,本人写一个“复合文件扫瞄编纂器”程序,又练手了,另有有用的代价。
五、复合文件函数
复合文件的函数和磁盘目次文件的操纵十分相似。一切这些函数,被分为3品种型:WINAPI全局函数,存储IStorage接口函数,流IStream接口函数。甚么是接口?甚么是接口函数?今后的文章中再连续先容,这里人人只需把“接口”当作是完成一组相干操纵功效的函数汇合就能够了。
WINAPI函数
功效申明
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()封闭流对象 WINAPI增补函数功效申明WriteClassStg()写CLSID到存储中,同IStorage::SetClass()ReadClassStg()读出WriteClassStg()写进的CLSID,相称于简化挪用IStorage::Stat()WriteClassStm()写CLSID到流的入手下手地位ReadClassStm()读出WriteClassStm()写进的CLSIDWriteFmtUserTypeStg()写进用户指定的剪贴板格局和称号到存储中ReadFmtUserTypeStg()读出WriteFmtUserTypeStg()写进的信息。便利使用程序疾速判别是不是是它必要的格局数据。CreateStreamOnHGlobal()内存句柄HGLOBAL转换为流对象GetHGlobalFromStream()获得CreateStreamOnHGlobal()挪用中利用的内存句柄
为了让人人疾速地扫瞄和把握基础办法,下面所列表的函数并非全体,我省略了“事件”函数和未完成函数部分。更周全的先容,请浏览MSDN。
上面程序片断,演示了一些基础函数功效和挪用办法。
示例一:创建一个复合文件,并在其下创建一个子存储,在该子存储中再创建一个流,写进数据。- voidSampleCreateDoc(){::CoInitialize(NULL); //COM初始化//假如是MFC程序,可使用AfxOleInit()替换HRESULThr;//函数实行前往值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(),则不挪用该函数}
复制代码
<br>
、运转示例程序一后,利用DFView.exe翻开察看复合文件的最终效果
示例二:翻开一个复合文件,列举其根存储下的一切对象。- #include<atlconv.h> //ANSI、MBCS、UNICODE转换voidSampleEnum(){ //假定你已做过COM初始化了LPCTSTRlpFileName=_T("c:a.stg");HRESULThr;IStorage*pStg=NULL;USES_CONVERSION;//(注6)LPCOLESTRlpwFileName=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));STATSTGstatstg;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();}
复制代码 6、小结
复合文件,布局化存储,是微软组件头脑的劈头,在此基本上持续开展出了延续性、定名、ActiveX、对象嵌进、现场激活......一系列的新手艺、新观点。因而了解和把握复合文件长短常主要的,即便在你的程序中并没有周全利用组件手艺,复合文件手艺也是能够独自被使用的。祝人人进修康乐,为社会主义软件奇迹而搏斗:-)
留功课啦......
功课1:写个小使用程序,从MSWORD的doc文件中,提掏出附加信息(作者、公司......)。
功课2:写个全功效的“复合文件扫瞄编纂器”。
注1:踅摸(xuemo),动词,南方方言,寻觅搜刮的意义。
注2:问:为何不上彀查材料进修?
答:开甚么国际打趣!在那悠远的1995年月,我的500块人为,不吃不喝恰好够上100小时的Internet网。
注3:OLE,对象的毗连与嵌进。
注4:能够用DFView.exe翻开MSWORD的DOC文件举行复合文件的扫瞄。可是该程序并没有完成国际化,不克不及翻开中文文件名的复合文件,因而必要更名后才干扫瞄。
注5:CLSID,在后续的文章中先容。
注6:关于COM中内存利用的成绩,在后续的文章中先容。
原文链接:http://www.vckbase.com/document/viewdoc/?id=1483
批评:
加上面的甚么都不改,就能够跑了。
#include<objidl.h>
#include<AFXCOM_.H>(yiqiu宣布于2007-7-3117:41:00)
第一个例子调试乐成:)
必要创建一个win32把持台使用程序而且包括头文件
#define_WIN32_WINNT0x0500
#include<ole2.h>
#include<assert.h>
而且还要把"ASSERT"改成“assert”
程序就能够运转啦!
上面入手下手自然业了
(xinxinst宣布于2007-7-2415:17:00)
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。 |
|