亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DCOM(分布式組件對象模型)原理淺析(二)

發布時間:2020-07-12 03:58:16 來源:網絡 閱讀:977 作者:liam2199 欄目:編程語言

今天我們來分析QueryInterface函數。


 DCOM(分布式組件對象模型)原理淺析(二)

HRESULT CDictionary::QueryInterface(const IID& iid, void **ppv)
{
	if(iid == IID_IUnknown)
	{
		*ppv = (IDictionary*)this;
		((IDictionary*)(*ppv))->AddRef();		
	}elseif(iid == IID_Dictionary)
	{
		*ppv = (IDictionary*)this;
		((IDictionary*)(*ppv))->AddRef();
	}elseif(iid == IID_SpellCheck)
	{
		*ppv = (ISpellCheck*)this;
		((ISpellCheck*)(*ppv))->AddRef();
	}
	else
	{
		*ppv = NULL;
		return E_NOINTERFACE;
	}
	
	return S_OK;	
}


根據COM接口的內存接口以及C++語言中類多重繼承的內存結構,我們實現QueryInterface函數。


QueryInterface函數對于iid的三種可能值分別進行了處理,不管客戶要想查詢字典對象所支持的哪個接口,QueryInterface都會返回相應的接口指針,如圖,當我們將this指針轉換為基類指針時,所得到的指針正好指向接口的vtable,所以我們用類型轉換函數就可以得到每個接口的vtable,也就是接口指針。


在第一個if語句塊中,我們并沒有把this指針直接轉換為IUnknown指針,根據C++語法,由于在CDictionary的基類樹中,有兩個IUnknown節點,因此直接把this指針轉換成IUnknown指針存在二義性。

先把this指針轉換成IDictionary或者ISpellCheck,再轉換成IUnknown,但必須保證每次查到的IUnknown接口完全一致。


這個程序直接把IDictionary接口指針當做IUnknown接口指針,這樣的轉換是符合COM規范的。

根據CDictionary的基類樹,這里的繼承關系不能用虛擬繼承,否則就不能保證IDictionary和ISpellCheck的vtable與COM接口的vtable的一致性。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陆河县| 宁都县| 仙桃市| 奉节县| 天峻县| 铜梁县| 鸡西市| 高平市| 安化县| 南城县| 谢通门县| 余干县| 乐至县| 方正县| 微山县| 正宁县| 古浪县| 通化县| 武城县| 贺州市| 梓潼县| 赤水市| 沙坪坝区| 独山县| 衡山县| 南汇区| 饶阳县| 外汇| 塔城市| 华坪县| 分宜县| 翼城县| 北碚区| 贺州市| 北京市| 罗江县| 巫山县| 清水河县| 荃湾区| 宁津县| 浠水县|