青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

COM 組件設計與應用(十七) ---持續性

作者:楊老師

下載源代碼

一、前言

  我們寫程序,經常需要實現這樣的需求:
例一、程序運行產生一個窗口,用戶關閉的時候需要記錄窗口的位置,以便下次運行時保持位置不變;
例二、由于程序運行時間很長,今天執行一部分,明天繼續執行。那么在下次運行前要恢復前次的狀態;
... ... ... ...

智慧的老師:以上這些需求,如何實現呢?
懵懂的學生:這個簡單,只要在程序退出前提取必要的信息保存到文件中,下次運行時再從文件中讀出來,設置一下就OK了。
智慧的老師:恩,不錯,這位同學的思想值得表揚。
懵懂的學生:不好意思,這都要感謝老師的栽培,我對您的景仰如滔滔江水......
智慧的老師:別臭P了,我話還沒有說完那......如果你需要提取和保存的信息很多,結構很復雜......怎么辦?
懵懂的學生:也好辦,我設計一個結構來記錄這些信息。
智慧的老師:恩......不錯。但如果這些信息提供方是別人寫的模塊,并且隨著版本的不同還經常變化,你怎么辦?
懵懂的學生:... ...
智慧的老師:解決這些問題的方法是---持續性。

二、原理
  持續性,也叫永久性。組件方提供 IPersistXXX 接口,調用者(容器)提供存儲介質,比如文件啦、內存啦、注冊表啦、流啦、文本啦......啦啦拉。需要保存的時候,調用者通過 IPersistXXX::Save() 接口函數讓組件去自己存儲屬性信息,而調用者根本不用關心存儲格式和存儲內容;需要還原狀態的時候,調用者打開存儲介質,然后同樣調用 IPersistXXX::Load() 接口函數讓組件自己去讀取屬性信息并完成初始化的設置。
  目前,微軟定義了如下各種類型的持續性接口,足夠滿足你的需求了。我們只要在自己寫的組件中實現其中一個或幾個持續性接口,那么調用者就可以按照統一的方式和我們的組件協商完成屬性信息的保存和狀態還原了。
 
持續性接口 簡要說明
IPersist    所有持續性接口的根,下面的接口大多從它派生出來。這個接口很簡單,只有一個函數 GetClassID()它返回組件的 CLSID 號,以便調用者能保存這個號為將來 CoCreateInstance() 啟動組件用。
   實現這個函數也很簡單,只要返回你組件中的 CLSID_XXX 即可,或者比較省事的方法是返回 GetObjectCLSID() 。
IPersistStream

派生自 IPersist,并增加了4個函數,從流(IStream)中讀寫組件屬性信息。

IsDirty() 組件內部屬性是否發生了變化。為調用者是否需要保存信息提供依據
Load() 從 IStream 中讀入信息,初始化組件屬性
Save() 把屬性信息保存到 IStream 中
GetSizeMax() 返回信息尺寸,以便調用者事先開辟空間
IPersistStreamInit 派生自 IPersistStream,并再增加了一個函數 InitNew() 用來完成一個默認的組件屬性初始化。
這個持續性接口是最常用的,本文示例中就實現了該接口。
IPersistMemory 和 IPersistStreamInit 類似,但使用的是內存塊,而不是大小可變化的 IStream 流。
IPersistStorage 和 IPersistStream 類似,但保存屬性信息使用的是存儲 IStorage,一個 IStorage 中可以有多個 IStream。
IPersistFile 和 IPersistStream 類似,但存儲介質為文件。
IPersistPropertyBag    使用屬性包(屬性名、屬性值)的文本方式保存信息。在 IE 瀏覽器中,HTML 嵌入 ActiveX 控件通常使用這個方法。
   在 HTML 中插入控件,<param name="屬性名稱" value="值"> 這樣的形式你應該見過吧?!
   在下一回的文章中,我們介紹這個接口。因為在 ActiveX 中,它太常用了。
IPersistPropertyBag2 擴展了 IPersistPropertyBag 接口。提供了更豐富一些的屬性管理用函數。
IPersistMoniker 用于命名(moniker)存儲和讀取狀態的持續性接口。
IPersistHistory 運行于 IE 上,想在用戶瀏覽 WEB 頁面時存儲和讀取狀態的持續性接口。

三、持續性接口組件的實現
  示例程序分別在 vc6.0 和 vc.net 上實現了 IPersistStreamInit 接口的 COM 組件和調用舉例。組件完成的功能是計算素數,你第一次運行的時候,會得到第一個素數2,然后是3,5,7,11......下班時間到了,今天就運行到這里。于是調用者開辟一個流來保存組件的屬性信息。明天繼續運行的時候,從流中原換組件狀態,開始了新的計算 13,17,19,23......
  這個示例應用完全是假設性的,其實沒有什么實用價值,只是演示了 IPersistStreamInit 接口的實現方法。另外,關于建立流(IStream)的方法,請參閱COM 組件設計與應用(一)》。

1、建立一個 ATL 工程項目。
2、增加 ATL 組件類,vc.net 使用者注意不要選擇“屬性化編程”方式,其它的設置全部使用默認方法。當然你愿意適當地改變選擇也無所謂。
3、設計完成你的組件功能。
   示例程序中,實現了一個接口函數 GetNext() 負責計算下一個素數。
4、添加IPersistStreamInit 接口。

class ATL_NO_VTABLE Cxxx : 	public CComObjectRootEx<...> ,	public CComCoClass<...>,	......	public IPersistStreamInit	// 手工添加持續性接口{......BEGIN_COM_MAP(Cxxx)	......		// 手工添加接口映射表入口	COM_INTERFACE_ENTRY(IPersistStreamInit)		// 表示如果要取得 IPersistStream 指針,則返回 IPersistStreamInit 指針	COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit)		// 表示如果要取得 IPersist 指針,則返回 IPersistStremInit 指針	COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersistStreamInit)END_COM_MAP()
5、完成 IPersistStreamInit 接口函數。
手工在 h 頭文件中增加函數聲明:
public:// IPersist	STDMETHOD(GetClassID)(/*[out]*/CLSID * pClassID);// IPersistStream	STDMETHOD(IsDirty)(void);	STDMETHOD(Load)(/*[in]*/IStream *pStm);	STDMETHOD(Save)(/*[in]*/IStream *pStm,/*[in]*/BOOL fClearDirty);	STDMETHOD(GetSizeMax)(/*[out]*/ULARGE_INTEGER *pcbSize);// IPersistStreamInit	STDMETHOD(InitNew)(void);
手工在 cpp 文件中增加函數實現:
// IPersistSTDMETHODIMP Cxxx::GetClassID(/*[out]*/CLSID * pClassID){	*pClassID = GetObjectCLSID();	return S_OK;}// IPersistStreamSTDMETHODIMP Cxxx::IsDirty(void){	if( 數據已經改變,需要保存 )	return S_OK;	else			return S_FALSE;}STDMETHODIMP Cxxx::Load(/*[in]*/IStream *pStm){	return pStm->Read( 讀到哪里, 讀多長字節, NULL);}STDMETHODIMP Cxxx::Save(/*[in]*/IStream *pStm,/*[in]*/BOOL fClearDirty){	if( fClearDirty )	清除內部表示數據變化的變量;	return pStm->Write( 需要保存的數據指針, 寫多長字節, NULL );}STDMETHODIMP Cxxx::GetSizeMax(/*[out]*/ULARGE_INTEGER *pcbSize){	pcbSize->LowPart = 需要保存數據長度的低位;	pcbSize->HighPart = 需要保存數據長度的高位;// 一般都是0,難道你的數據長度都超過了 4G?	return S_OK;}// IPersistStreamInitSTDMETHODIMP Cxxx::InitNew(void){	內部屬性數據默認初始化;	設置或清除內部表示數據變化的變量;	return S_OK;}
四、小結
  下載示例程序后,結合本文仔細閱讀代碼,并試著運行看看效果。如果你理解了,那么你能自己實現 IPersistFile 接口嗎?你能自己實現 IPersistStorage 接口嗎?你實現的持續性接口越多,別人使用你的組件就越方便,也就是說你的組件就能大賣特賣啦,祝你為中國軟件事業做貢獻的同時多多賺錢:-)下回我們用 IPersistPropertyBag 接口實現持續性屬性包功能,別忘了看呦......

posted on 2007-07-30 15:59 旅途 閱讀(406) 評論(0)  編輯 收藏 引用 所屬分類: COM+/DCOM

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本色道久久综合狠狠躁篇怎么玩 | 国产一区二区三区久久悠悠色av| 欧美精品在线一区| 老牛影视一区二区三区| 久久免费国产精品| 免费成人毛片| 欧美乱妇高清无乱码| 欧美三级午夜理伦三级中文幕 | 欧美一区二区三区视频免费播放| 亚洲私人影院在线观看| 久久米奇亚洲| 亚洲国产精品久久久久婷婷884| 你懂的亚洲视频| 久久亚洲综合色| 欧美人与禽猛交乱配| 国产精品伦一区| 国内精品久久久| 亚洲全部视频| 亚洲综合欧美| 久久男人av资源网站| 免费亚洲一区二区| 亚洲一区二区精品| 美女国内精品自产拍在线播放| 欧美日韩国产色视频| 国产日韩一区在线| 99精品国产一区二区青青牛奶| 小辣椒精品导航| 亚洲国产精品尤物yw在线观看 | 久久综合五月| 亚洲美女精品成人在线视频| 亚洲免费在线| 欧美成人dvd在线视频| 国产精品日韩一区二区三区| 在线观看国产成人av片| 亚洲欧美另类国产| 欧美国产第一页| 欧美亚洲一区二区在线| 欧美精品系列| 亚洲国产高清aⅴ视频| 亚洲深夜福利| 亚洲国产婷婷香蕉久久久久久| 午夜激情综合网| 国产精品高精视频免费| 亚洲福利视频二区| 久久久久久伊人| 午夜精品久久久久久久久久久久久| 免费久久精品视频| 国产一区二区三区不卡在线观看 | 亚洲欧美国产日韩中文字幕| 欧美高清在线一区二区| 久久精品国产一区二区三区免费看| 夜夜爽av福利精品导航| 在线亚洲免费| 亚洲国产视频一区二区| 久久久久久久久久久久久久一区| 国产精品一区二区在线观看| 亚洲一区二区三区免费观看| av不卡免费看| 国产精品va在线播放| 在线一区二区视频| 亚洲免费观看高清在线观看| 欧美伦理91i| 在线视频你懂得一区| 日韩一级在线观看| 国产精品成人观看视频免费 | 蜜臀久久99精品久久久画质超高清| 国产精品免费小视频| 亚洲免费视频在线观看| 一本色道**综合亚洲精品蜜桃冫| 欧美日韩精品一二三区| 在线视频中文亚洲| 一区二区三区日韩| 国产精品久久久一本精品| 亚洲小说欧美另类社区| 亚洲伊人第一页| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美日韩免费观看一区| 亚洲免费福利视频| 99国产麻豆精品| 国产精品一区二区三区免费观看 | 中文欧美字幕免费| 一区二区三区国产| 国产午夜精品视频免费不卡69堂| 久久人体大胆视频| 农村妇女精品| 亚洲欧美网站| 久久精品国产99| 日韩亚洲欧美中文三级| 一区二区三区四区五区视频| 国产精品免费小视频| 蜜臀av在线播放一区二区三区| 欧美高清不卡在线| 亚洲一区日本| 久久蜜臀精品av| 亚洲视频一区二区| 久久精品动漫| 亚洲女优在线| 另类天堂av| 国产精品国产三级欧美二区 | 免费日韩一区二区| 亚洲免费一级电影| 久久精品在线免费观看| 99精品国产99久久久久久福利| 亚洲欧美日韩人成在线播放| 91久久国产综合久久| 亚洲综合成人婷婷小说| 亚洲日本在线观看| 亚洲欧美一区二区激情| 亚洲另类在线一区| 欧美制服丝袜| 亚洲一二三级电影| 蜜桃精品久久久久久久免费影院| 性欧美暴力猛交69hd| 欧美 日韩 国产一区二区在线视频| 亚洲性图久久| 欧美精品在线观看91| 欧美粗暴jizz性欧美20| 国产一区二区三区黄视频| 一本色道久久加勒比精品| 亚洲高清一区二区三区| 小嫩嫩精品导航| 亚洲综合不卡| 欧美成在线观看| 欧美成人一区在线| 激情久久久久久久久久久久久久久久| 一区二区91| 一区二区三区欧美在线| 欧美xx视频| 欧美激情精品| 亚洲国产欧美在线人成| 久久久夜色精品亚洲| 久久国产精彩视频| 国产精品久久久一区二区| 一区二区三区欧美视频| 99pao成人国产永久免费视频| 老色批av在线精品| 另类成人小视频在线| 国产一区二区丝袜高跟鞋图片| 亚洲一区日韩| 欧美在线免费看| 国产农村妇女精品| 亚洲欧美国产精品桃花| 久久精品国产91精品亚洲| 国产日韩精品一区二区三区在线| 亚洲一区二区三区精品在线观看| 欧美亚洲一区二区在线| 国产日产亚洲精品系列| 久久国产婷婷国产香蕉| 欧美成人dvd在线视频| 亚洲国产欧美国产综合一区| 美女图片一区二区| 亚洲黄色高清| 亚洲一区二区三区成人在线视频精品| 欧美视频一区二区三区在线观看| 野花国产精品入口| 欧美在线黄色| 尤物在线观看一区| 欧美激情第二页| 亚洲一区二区三区在线看 | 欧美日韩亚洲免费| 亚洲主播在线观看| 国产精品99久久久久久久vr | 亚洲一区久久久| 国产日韩精品电影| 久久久久久尹人网香蕉| 亚洲成人在线视频播放 | 99精品欧美一区| 欧美中文在线观看| 亚洲国产成人久久综合| 欧美日韩中文| 久久精品国产一区二区电影| 亚洲激情一区二区三区| 亚洲欧美第一页| 亚洲国产日本| 国产免费观看久久| 欧美精品亚洲精品| 欧美一区二区三区日韩| 亚洲黄色免费电影| 久久gogo国模啪啪人体图| 亚洲国产一区二区视频| 国产精品久久久久一区二区三区| 久久精品视频亚洲| 亚洲九九九在线观看| 久久夜色精品国产亚洲aⅴ | 久久伊人免费视频| 亚洲一区二区毛片| 亚洲高清一二三区| 国产区在线观看成人精品| 欧美大片国产精品| 久久精品99国产精品| 亚洲视频在线二区| 亚洲电影免费观看高清完整版| 亚洲欧美成人网| 一区二区免费在线视频| 雨宫琴音一区二区在线| 国产精品久久久久影院亚瑟| 欧美—级在线免费片| 久久久中精品2020中文| 午夜在线精品| 亚洲一区二区高清|