欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
COM組件設計與應用(十八)——屬性包

COM組件設計與應用(十八)——屬性包

作者:
楊老師

下載源代碼

一、前言

  書(shū)接上回,本回著(zhù)落在介紹屬性包 IPersistPropertyBag 接口的實(shí)現方法和調用方式。屬性包,是以“名稱(chēng) - 值”的方式提供組件持續性的支持,而“名稱(chēng) - 值”恰恰又適合于用文本方式來(lái)表現。下面的片段是在 HTML 中插入 Microsoft MonthView Control ActiveX 控件后的樣式:

<object classid="clsid:232E456A-87C3-11D1-8BE3-0000F8754DA1" id="MonthView1"><param name="_ExtentX" value="9393"><param name="_ExtentY" value="4974"><param name="_Version" value="393216"><param name="ForeColor" value="0"><param name="MaxSelCount" value="7"><param name="MonthColumns" value="1"><param name="CurrentDate" value="38632"><param name="MaxDate" value="2958465"><param name="MinDate" value="-53688"></object>
以文本方式保存組件屬性,比較直觀(guān)、容易修改,上面 HTML 示例中的 <param name="屬性名" value="值"> 就很清晰。下面開(kāi)始介紹如何在組件中實(shí)現 IPersistPropertyBag 接口。

二、組件的實(shí)現
(1)vc6.0 開(kāi)發(fā)步驟
1、建立一個(gè)工作空間(WorkSpace)。
2、在這個(gè)工作空間中,建立 ATL 工程,示例程序工程為 Simple18。
3、增加 ATL 對象類(lèi),默認全部選項。示例程序中的 ATL 對象短名稱(chēng)是 Property。
4、增加一些屬性。在以前的章回中,我們只介紹了增加接口函數的方法,由于今天是首次增加接口屬性,所以稍微細致一些。步驟是,在ClassView卡片中選擇接口(IProperty)后,執行鼠標右鍵菜單"Add Property..."



5、增加 BSTR 類(lèi)型的接口屬性 str,同樣的方式,再增加一個(gè) long 型的接口屬性 interger。在示例程序中,這兩個(gè)屬性其實(shí)只為演示,并沒(méi)有實(shí)際的意義。



6、接口中的屬性,多數情況下會(huì )對應對象內部的一個(gè)成員變量,因此我們現在要添加成員變量。選擇對象類(lèi)名,執行鼠標右鍵菜單"Add Member Variable...."




7、添加兩個(gè)成員變量,一個(gè)是 CComBSTR m_str 對應于接口屬性 str;另一個(gè)是 long m_integer 對應于接口屬性 integer。



(2)vc.net 開(kāi)發(fā)步驟
1、建立一個(gè)空白解決方案。
2、在解決方案中,新增 ATL 項目。示例程序中項目名稱(chēng)叫 Simple18, 注意不要選擇“屬性化編程”方式。
3、添加 ATL 類(lèi)。選擇 “ATL 的簡(jiǎn)單對象”。默認全部選項。示例程序中 ATL 類(lèi)短名稱(chēng)為 Property,類(lèi)名稱(chēng)為 CMyProperty。(注1)
4、 增加一些屬性。在以前的章回中,我們只介紹了增加接口函數的方法,由于今天是首次增加接口屬性,所以稍微細致一些。步驟是,在類(lèi)視圖卡片中選擇接口(IProperty)后,執行鼠標右鍵菜單"添加屬性..."



5、增加 BSTR 類(lèi)型的接口屬性 str,同樣的方式,再增加一個(gè) long 型的接口屬性 interger。在示例程序中,這兩個(gè)屬性其實(shí)只為演示,并沒(méi)有實(shí)際的意義。



6、接口中的屬性,多數情況下會(huì )對應對象內部的一個(gè)成員變量,因此我們現在要添加成員變量。選擇對象類(lèi)名,執行鼠標右鍵菜單"添加變量...."



7、添加兩個(gè)成員變量,一個(gè)是 CComBSTR m_str 對應于接口屬性 str;另一個(gè)是 long m_integer 對應于接口屬性 integer。


(3)實(shí)現代碼
  至此,我們組件的框架已經(jīng)完成,下面該完成函數函數的實(shí)現了:
STDMETHODIMP Cxxx::get_str(BSTR* pVal){*pVal = m_str.Copy();return S_OK;}STDMETHODIMP Cxxx::put_str(BSTR newVal){m_str = newVal;return S_OK;}STDMETHODIMP Cxxx::get_integer(LONG* pVal){*pVal = m_integer;return S_OK;}STDMETHODIMP Cxxx::put_integer(LONG newVal){m_integer = newVal;return S_OK;}
沒(méi)有什么復雜的,就是實(shí)現 str、integer 兩個(gè)屬性值的設置和讀取功能。
(4)添加 IPersistPropertyBag 接口
  還記得我們在上回書(shū)中如何添加 IPersistStreamInit 的嗎?添加 IPersistPropertyBag 的方法也一樣,但這次我們換一個(gè)方式,即我們不從 IPersistPropertyBag 派生,而是從 IPersistPropertyBagImpl<> 派生。在 ATL 中,系統幫我們已經(jīng)完成了很多接口的默認實(shí)現,我們只要從 IxxxImpl<> 派生,然后再添加一些必要的映射和變量,就可以了。這樣顯然要比自己去實(shí)現接口的所有函數要簡(jiǎn)單許多了。其實(shí),如果你明白了本回 IPersistPropertyBagImpl<> 派生的方法后,你完全可以修改前回書(shū)中的實(shí)現方法,從 IPersistStreamInit 派生改進(jìn)為從 IPersistStreamInitImpl<> 派生。
class ATL_NO_VTABLE Cxxx :public CComObjectRootEx<...>,public CComCoClass<...>,public IDispatchImpl<...>,public IPersistPropertyBagImpl<Cxxx>	// 手工添加派生類(lèi){... ... ...BEGIN_COM_MAP(Cxxx)... ... ...COM_INTERFACE_ENTRY(IPersistPropertyBag)	// 手工添加接口表END_COM_MAP()... ... ...	// 手工添加屬性映射表,這是 IPersistXXXImpl 所必須的。// 將來(lái)你在寫(xiě) ActiveX 的時(shí)候,ATL 向導會(huì )幫我們添加屬性映射表BEGIN_PROP_MAP(Cxxx)// 參數:"屬性名稱(chēng)", 接口屬性序號(見(jiàn)IDL文件), 屬性頁(yè)對話(huà)窗PROP_ENTRY("str", 1, CLSID_NULL)PROP_ENTRY("integer", 2, CLSID_NULL)END_PROP_MAP()... ... ...public:... ... ...// 這個(gè)成員變量,是 IPersistXXXImpl 所必須的bool m_bRequiresSave;	// 表示屬性數據是否已經(jīng)改變而需要保存};
  我們只要手工添加以上內容,而不用自己寫(xiě)任何 IPersistPropertyBag 接口的函數,多簡(jiǎn)單呀!天空出彩霞呀,地上開(kāi)紅花呀......會(huì )唱這只歌的同學(xué)請舉手,每個(gè)人獎勵 vckbase 的專(zhuān)家分 500 !

三、調用者的實(shí)現
  我們在閱讀 MSDN 關(guān)于 IPersistPropertyBag 接口函數的時(shí)候,你會(huì )發(fā)現還需要一個(gè)接口 IPropertyBag 與之配合才能實(shí)現屬性包功能。而 IPropertyBag 則需要我們在調用者(容器)中來(lái)實(shí)現該接口。它們之間的關(guān)系如下:



   前面幾回書(shū)中,我們已經(jīng)學(xué)會(huì )了從 IUnknown 派生類(lèi),也學(xué)會(huì )了從 IDispatch 派生類(lèi),也學(xué)會(huì )了從 ICallBack 派生類(lèi)......同樣,這回我們要從 IPropertyBag 派生了。在示例程序中,我們添加了一個(gè)類(lèi) CPropertyBag::public IPropertyBag,同時(shí)重載了所有的虛函數。

 

STDMETHODIMP CPropertyBag::QueryInterface(const struct _GUID &iid,void ** ppv){*ppv = this;return S_OK;}ULONG __stdcall CPropertyBag::AddRef(void){	return 1;		}	// 做個(gè)假的就可以,因為反正這個(gè)對象在程序結束前是不會(huì )退出的ULONG __stdcall CPropertyBag::Release(void){	return 0;		}	// 做個(gè)假的就可以,因為反正這個(gè)對象在程序結束前是不會(huì )退出的STDMETHODIMP CPropertyBag::Read(LPCOLESTR pszPropName,VARIANT *pVar,IErrorLog *pErrorLog){// 根據 pszPropName 指定的屬性名稱(chēng),你要提供該屬性的值。// 而值的數據類(lèi)型已經(jīng)在 pVal->vt 中指定了。if( 如果能提供指定的數據 )	return S_OK;else	return E_FAIL;}STDMETHODIMP CPropertyBag::Write(LPCOLESTR pszPropName,VARIANT *pVar){// 根據 psaPropName 指定的屬性名稱(chēng)和 pVar 提供的值// 你保存到文本中去吧。return S_OK;}
  以上是調用者(容器)程序的關(guān)鍵部分,其它的管理和協(xié)調部分,讀者去閱讀示例程序代碼。編譯注冊組件,并運行調用者示例程序,顯示如下:



  在編輯窗口中你可以隨便指定 str 和 interger 的值,然后“啟動(dòng)組件”,那么你設定的屬性值就會(huì )在啟動(dòng)組件的同時(shí),通過(guò) IPersistPropertyBag 接口設置到組件中(還原了持續性的環(huán)境)。而后,你就可以在下面的 Property 分組操作中,“設置/讀取”組件的屬性了。當“關(guān)閉組件”的時(shí)候,程序通過(guò)調用 IPersistPropertyBag 接口函數,又重新取得組件的屬性名稱(chēng)和值保存到編輯窗的文本中了。

四、小結
  理解了本回屬性包接口的功能,你就能體會(huì )出 IE 是如何裝載 ActiveX (注2)控件并設置控件的狀態(tài)了。

注1:在 vc.net 中,由于系統已經(jīng)有 CProperty 類(lèi),所以這里我們改換名稱(chēng)為 CMyProperty。
注2:通過(guò)十八回的學(xué)習,我們已經(jīng)了解組件的一些常用接口,為我們學(xué)習 ActiveX 的組件編程打下了基礎。下回書(shū),我們就開(kāi)始學(xué)習 ActiveX。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
基于A(yíng)TL技術(shù)原理圖解析器的開(kāi)發(fā)
2年Vue項目實(shí)戰經(jīng)驗匯總
C#創(chuàng )建COM組件全過(guò)程詳細介紹
我對COM的理解
COM組件設計與應用之.NET中用ATL寫(xiě)組件2
VC知識庫文章 - COM 組件設計與應用(七)——編譯、注冊、調用
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久