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

隨筆-250  評論-20  文章-55  trackbacks-0
一、引言
  最近,由于工作的要求,我需要在 IE 上做一些開發工作。于是在 MSDN 上翻閱了一些資料,根據 MSDN 上的說明我用 ATL 勝利完成了“資本家老板”分配的任務。
(并且在白天睡覺的過程中夢到了老板給我加工資啦......)
現在,我把 MSDN 上的原文資料,經過翻譯整理并把一個 ATL 的實現奉賢給 VCKBASE 上的朋友們。

二、概念
  在翻譯的過程中,有兩個詞匯非常不好理解。第一個詞是 Band 對象,詞典中翻譯為“鑲邊、裙子邊、帶子、樂隊......”我的英文水平有限,實在不知道應該翻譯為什么詞匯更合適。于是我毅然決然地決定:在如下的論述中,依然使用 band 這個詞!(什么?沒聽明白?我的意思就是說,我不翻譯這個詞了)但到底 Band 對象應該如何理解那?請看圖一:


圖一

  圖一中畫紅圈的地方,分別稱作“垂直的瀏覽器欄”、“水平的瀏覽器欄”、“工具欄”和“桌面工具欄”。這些“欄”,都可以在 IE 的“查看”菜單中或鼠標右鍵的上下文快捷方式菜單中顯示或隱藏起來。這些界面窗口的實現,其實就是實現一種 COM 接口對象,而這個對象叫 band。這個概念實在是只能意會而無法言傳的,我總不能在文章中把它翻譯為“總是靠在 IE 主窗口邊上的對象”吧?^_^
  另外,還有一個詞叫 site。這個很好翻譯,叫“站點”!。呵呵,我敢打包票,如果你要能理解這個翻譯在計算機類文章中的含義,那就只能恭喜你了,你的智慧太高了。(都是學計算機軟件的人,做人的差距咋就這么大呢?)在本篇文章中,site 可以這樣理解:IE 的主框架四周,就好比是“汽車站”,那些 band 對象,就好比是“汽車”。band 汽車總是可以停靠在“汽車站”上。所以,site 就是“站點”,它也是 COM 接口的對象(IObjectWithSite、IInputObjectSite)。

三、原理

3.1 基本 band 對象
  Band 對象,從 Shell 4.71(IE 5.0) 開始提供支持。Band 是一個 COM 對象,必須放在一個容器中去使用,當然使用它們就好象使用普通窗口是一樣的。IE 就是一個容器,桌面 Shell 也是一個容器,它們提供不同的函數功能,但基本的實現是相似的。
  Band 對象分三種類型,瀏覽器欄 band(Explorer bands)、工具欄 band(Tool Bands)和桌面工具欄(Desk bands),而瀏覽器欄 band 又有兩種表現形式:垂直和水平的。那么 IE 和 Shell 如何區分并加載這些 bands 對象呢?方法是:你要對不同的 band 對象,在注冊表中注冊不同的組件類型(CATID)。

Band 樣式

組件類型

CATID

垂直的瀏覽器欄CATID_InfoBand00021493-0000-0000-C000-000000000046
水平的瀏覽器欄CATID_CommBand00021494-0000-0000-C000-000000000046
桌面的工具欄CATID_DeskBand00021492-0000-0000-C000-000000000046

  IE 工具欄不使用組件類型注冊,而是使用在注冊進行 CLSID 的登記方式。詳細情況見 3.3。
  在例子程序中,實現了全部四個類型的 band 對象,垂直瀏覽器欄(CVerticalBar)顯示了一個 HTML 文件,并且實現了對 IE 主窗口瀏覽網頁的導航等功能;水平的瀏覽器欄(CHorizontalBar)是一個編輯窗,它同步顯示當前網頁的 BODY 源文件內容;IE 工具欄(CToolBar)最簡單,只是添加了一個空的工具欄;桌面工具欄(CDeskBar)實現了一個單行編輯窗口,你可以在上面輸入命令行或文件名稱,回車后它會執行 Shell 的打開動作。

3.2 必須實現的 COM 接口
  Band 對象是 IE 或 Shell 的進程內服務器,所以它被包裝在 DLL 中。而作為 COM 對象,它必須要實現 IUnknown 和 IClassFactory 接口。(大家可以不同操心,因為我們用 ATL 寫程序,這兩個接口是不用我們自己寫代碼的。)另外,Band 對象還必須實現 IDeskBand、IObjectWithSite 和 IPersistStream 三個接口:
  IPersistStream 是持續性接口的一種。當 IE 加載 band 對象的時候,它通過這個接口的 Load 方法傳遞屬性值給對象,讓其進行初始化;而當卸載前,IE 則調用這個接口的 Save 方法保存對象的屬性。用 ATL 實現這個接口很簡單:
class ATL_NO_VTABLE Cxxx : 
	......
	public IPersistStreamInitImpl, // 添加繼承
	......
{
public:
	BOOL m_bRequiresSave; // IPersistStreamInitImpl 所必須的變量
......
BEGIN_COM_MAP(CVerticalBar)
	......
	COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
	COM_INTERFACE_ENTRY2(IPersistStream, IPersistStreamInit)
	COM_INTERFACE_ENTRY(IPersistStreamInit)
	......
END_COM_MAP()

BEGIN_PROP_MAP(Cxxx)
...... // 添加需要持續性的屬性
END_PROP_MAP()		
  上面的代碼,其實實現的是 IPersistStreamInit 接口,不過沒有關系,因為 IPersistStreamInit 派生自 IPersistStream,實例化了派生類,自然就實例化了基類。在例子程序中,我只在桌面工具欄對象中添加了持續性屬性,用來保存和初始化“命令行”。另外 COM_INTERFACE_ENTRY2(A,B)表示的含義是:如果想查詢A接口的指針,則提供B接口指針來代替。為什么可以這樣那?因為B接口派生自A接口,那么B接口的前幾個函數必然就是A接口的函數了,自然B接口的地址其實和A接口的地址是一樣的了。
  IObjectWithSite 是 IE 用來對插件進行管理和通訊用的一個接口。必須要實現這個接口的2個函數:SetSite() 和 GetSite()。當 IE 加載 band 對象和釋放 band 對象的時候,都要調用 SetSite()函數,那么在這個函數里正好是寫初始化和釋放操作代碼的地方:
STDMETHODIMP Cxxx::SetSite(IUnknown *pUnkSite)
{
	if( NULL == pUnkSite )	// 釋放 band 的時候
	{
		// 如果加載的時候,保存了一些接口
		// 那么現在:釋放它
	}
	else	// 加載 band 的時候
	{
		m_hwndParent = NULL;	// 裝載 band 的父窗口(就是帶有標題的那個框架窗口)

		// 這個窗口的句柄,是調用 IUnknown::QueryInterface() 得到 IOleWindow
		// 然后調用 IOleWindow::GetWindow() 而獲得的。
		CComQIPtr< IOleWindow, &IID_IOleWindow > spOleWindow(pUnkSite);
		if( spOleWindow )	spOleWindow->GetWindow(&m_hwndParent);
		if( !m_hwndParent )	return E_FAIL;
		
		// 現在,正好是建立子窗口的時機。
		// 注意,子窗口建立的時候,不要使用 WS_VISIBLE 屬性
		... ...
		// 在例子程序中,用 CAxWindow 實現了一個能包容ActiveX的容器窗口(垂直瀏覽器欄)
		// 在例子程序中,用 WIN API 函數 CreateWindow 實現了標準窗口(水平瀏覽器欄、工具欄)
		// 在例子程序中,用 CWindowImpl 實現了一個包容窗口(桌面工具欄)

		/*********************************************************/
		   以下部分,根據 band 對象特有的功能,是可以選擇實現的
		**********************************************************/		
		// 如果子窗口實現了用戶輸入,那么必須實現 IInputObject 接口,
		// 而該接口是被 IE 的 IInputObjectSite 調用的,因此在你的對象
		// 中,應該保存 IInputObjectSite 的接口指針。
		// 在類的頭文件中,定義:
		// CComQIPtr< IInputObjectSite, &IID_IInputObjectSite > m_spSite;

		m_spSite = pUnkSite;	// 保存 IInputObjectSite 指針
		if( !m_spSite )		return E_FAIL;

		// 你需要控制 IE 的主框架嗎?
		// 那么在類的頭文件中,定義:
		// CComQIPtr< IWebBrowser2, &IID_IWebBrowser2 > m_spFrameWB;
		// 然后,先取得 IServiceProvider,再取得 IWebBrowser2

		CComQIPtr < IServiceProvider, &IID_IServiceProvider> spSP(pUnkSite);
		if( !spSP )	return E_FAIL;
		spSP->QueryService( SID_SWebBrowserApp, &m_spFrameWB );
		if( !m_spFrameWB)	return E_FAIL;

		// 如果你取得了 IE 主框架的 IWebBrowser2 指針
		// 那么,當它發生了什么事情,你難道不想知道嗎?
		// 定義:CComPtr m_spCP;

		CComQIPtr< IConnectionPointContainer,
			&IID_IConnectionPointContainer> spCPC( m_spFrameWB );
		if( spCPC )
		{
			spCPC->FindConnectionPoint( DIID_DWebBrowserEvents2, &m_spCP );
			if( m_spCP )
			{
				m_spCP->Advise( reinterpret_cast< IDispatch * >( this ), &m_dwCookie );
			}
		}

		// 咳~~~ 不說了,看源碼去吧。這里能干的事情太多了... ...
	}
	return S_OK;
}		
IDeskBand 是一個特殊的 band 對象接口,有一個方法函數:GetBarInfo();
IDockingWindow 是 IDeskBank 的基類,有3個方法函數:ShowDW()、CloseDW()、ResizeBorderDW();
IOleWindow 又是 IDockingWindow 的基類,有2個方法函數:GetWindow()、ContextSensitiveHelp();

  首先聲明 IDeskBand ,然后要實現 IDeskBand 接口的共6個函數,這些函數比較簡單,不同類型的 band 對象,其實現方法也都基本一致:
class ATL_NO_VTABLE Cxxx : 
	......
	public IDeskBand,
	......
{
......
BEGIN_COM_MAP(Cxxx)
	......
	COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
	......
END_COM_MAP()



// IOleWindow
STDMETHODIMP Cxxx::GetWindow(HWND * phwnd)
{	// 取得 band 對象的窗口句柄
	// m_hWnd 是建立窗口時候保存的
	*phwnd = m_hWnd;	
	return S_OK;
}

STDMETHODIMP Cxxx::ContextSensitiveHelp(BOOL fEnterMode)
{	// 上下文幫助,參考 IContextMenu 接口
	return E_NOTIMPL;
}

// IDockingWindow
STDMETHODIMP CVerticalBar::ShowDW(BOOL bShow)
{	// 顯示或隱藏 band 窗口
	if( m_hWnd )
		::ShowWindow( m_hWnd, bShow ? SW_SHOW : SW_HIDE);

	return S_OK;
}

STDMETHODIMP CVerticalBar::CloseDW(DWORD dwReserved)
{	// 銷毀 band 窗口
	if( ::IsWindow( m_hWnd ) )
		::DestroyWindow( m_hWnd );

	m_hWnd = NULL;

    return S_OK;
}

STDMETHODIMP CVerticalBar::ResizeBorderDW(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved)
{	// 當框架窗口的邊框大小改變時
	return E_NOTIMPL;
}

// IDeskBand
STDMETHODIMP CVerticalBar::GetBandInfo(DWORD dwBandID, DWORD dwViewMode,  DESKBANDINFO* pdbi)
{	
         // 取得 band 的基本信息,你需要填寫 pdbi 參數作為返回
	if( NULL == pdbi )		return E_INVALIDARG;

	// 如果將來需要調用 IOleCommandTarget::Exec() 則需要保存這2個參數
	m_dwBandID = dwBandID;
	m_dwViewMode = dwViewMode;

	if(pdbi->dwMask & DBIM_MINSIZE)
	{	// 最小尺寸
		pdbi->ptMinSize.x = 10;
		pdbi->ptMinSize.y = 10;
	}

	if(pdbi->dwMask & DBIM_MAXSIZE)
	{	// 最大尺寸 (-1 表示 4G)
		pdbi->ptMaxSize.x = -1;
		pdbi->ptMaxSize.y = -1;
	}

	if(pdbi->dwMask & DBIM_INTEGRAL)
	{
		pdbi->ptIntegral.x = 1;
		pdbi->ptIntegral.y = 1;
	}

	if(pdbi->dwMask & DBIM_ACTUAL)
	{
		pdbi->ptActual.x = 0;
		pdbi->ptActual.y = 0;
	}

	if(pdbi->dwMask & DBIM_TITLE)
	{	// 窗口標題
		wcscpy(pdbi->wszTitle,L"窗口標題");
	}

	if(pdbi->dwMask & DBIM_MODEFLAGS)
	{
		pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT;
	}

	if(pdbi->dwMask & DBIM_BKCOLOR)
	{	// 如果使用默認的背景色,則移除該標志
		pdbi->dwMask &= ~DBIM_BKCOLOR;
	}

	return S_OK;
}		
3.3 選擇實現的 COM 接口
  有兩個接口不是必須實現的,但也許很有用:IInputObject 和 IContextMenu。如果 band 對象需要接收用戶的輸入,那么必須實現 IInputObject 接口。IE 實現了 IInputObjectSite 接口,當容器中有多個輸入窗口時,它調用 IInputObject 接口方法去負責管理用戶的輸入焦點。
在瀏覽器欄中需要實現3個函數:UIActivateIO()、HasFocusIO()、TranslateAcceleratorIO()。
當瀏覽器欄激活或失去活性的時候,IE 調用 UIActivateIO 函數,當激活的時候,瀏覽器欄一般調用 SetFocus 去設置它自己窗口的焦點。當 IE 需要判斷哪個窗口有焦點的時候,它調用 HasFocusIO 。當瀏覽器欄的窗口或其子窗口有輸入焦點時,則應返回 S_OK,否則返回 S_FALSE。TranslateAcceleratorIO 允許對象處理加速鍵,例子程序中沒有實現,所以直接返回 S_FALSE。
STDMETHODIMP CExplorerBar::UIActivateIO(BOOL fActivate, LPMSG pMsg)
{
    if(fActivate)
        SetFocus(m_hWnd);

    return S_OK;
}

STDMETHODIMP CExplorerBar::HasFocusIO(void)
{
    if(m_bFocus)
        return S_OK;

    return S_FALSE;
}

STDMETHODIMP CExplorerBar::TranslateAcceleratorIO(LPMSG pMsg)
{
    return S_FALSE;
}      
  Band 對象能夠通過包容器的 IOleCommandTarget::Exec() 調用執行命令。而 IOleCommandTarget 接口指針,則可以通過調用包容器的 IInputOjbectSite::QueryInterface(IID_IOleCommandTarget,...) 函數得到。CGID_DeskBand 是命令組,當一個 band 對象的 GetBandInfo 被調用的時候,包容器通過 dwBandID 參數指定一個 ID 給 band 對象,對象要保存住這個ID,以便調用 IOleCommandTarget::Exec()的時候使用。ID 的命令有:
  • DBID_BANDINFOCHANGED
    Band 的信息變化。設置參數 pvaIn 為 band ID, 該 ID 就是最近一次調用 GetBandInfo 所得到的值,容器會調用 band 對象的 GetBandInfo 函數來更新請求信息。
  • DBID_MAXIMIZEBAND
    最大化 band。設置參數 pvaIn 為 band ID,該 ID 就是最近一次調用 ?GetBandInfo ?所得到的值。
  • DBID_SHOWONLY
    打開或關閉容器中其它的 bands。 設置參數 pvaIn 為VT_UNKNOWN 類型,它可以是如下的值:
     
    描述
    pUnkband 對象的 IUnknown 指針,其它的桌面 bands 將被隱藏
    0隱藏所有的桌面 bands
    1顯示所有的桌面 bands

  • DBID_PUSHCHEVRON
    在菜單項左邊顯示“v”的選擇標志。容器發送一個 RB_PUSHCHEVRON 消息,當 band 對象接收到通知消息 RBN_CHEVRONPUSHED 提示它顯示一個"v"的標志。設置 IOleCommandTarget::Exec 函數中 nCmdExecOpt 參數為 band ID,該 ID 是最近一次調用 GetBandInfo ?所得到的值,設置 IOleCommandTarget::Exec 函數中 pvaIn 參數為 VT_I4 類型,這是應用程序定義的一個值,它通過通知消息 RBN_CHEVRONPUSHED 中lAppValue 回傳給 band 對象。

3.4 Band 對象注冊
  Band 對象必須注冊為一個 OLE 進程內的服務器,并且支持 apartment 線程公寓。注冊表中默認鍵的值是表示菜單的文字。對于瀏覽器欄,它加到 IE 菜單的“查看\瀏覽器欄”中;對于工具欄 band ,它加到 IE 菜單的“查看\工具欄”中;對于桌面 band, 它加到系統任務欄的快捷菜單中。在菜單資源中,可以使用“&”指明加速鍵。

通常,一個基本的 band 對象的注冊表項目是:

HKEY_CLASSES_ROOT
CLSID
{你的 band 對象的 CLSID}

  (Default) = 菜單的文字
  InProcServer32
   (Default) = DLL 的全路徑文件名
   ThreadingModel= Apartment

工具欄 bands 還必須把它們的 CLSID 注冊到 IE 的注冊表中。

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar 下給出 CLSID 作為鍵名,而其鍵值是被忽略的。

HKEY_LOCAL_MACHINE
Software
Microsoft
Internet Explorer
Toolbar

  {你的 band 對象的 CLSID}

  還有幾個可選的注冊表項目(例子程序并不是這樣實現的)。比如,你想讓瀏覽器欄顯示 HTML 的話,必須要如下設置注冊表:

HKEY_CLASSES_ROOT
CLSID
{你的 Band 對象的 CLSID}
Instance
CLSID
  
(Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}

同時,如果要指定一個本地的 HTML 文件,那么要如下設置:

HKEY_CLASSES_ROOT
CLSID
{你的 Band 對象的 CLSID}
Instance
InitPropertyBag
  
Url

  另外,還可以指定瀏覽器欄的寬和高,當然,它是依賴于這個欄是縱向還是橫向的。其實這個項目無所謂,因為當用戶調整了瀏覽器欄的大小后,會自動保存在注冊表中的。

HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{你的 Band 對象的 CLSID}
  
BarSize

  BarSize 鍵的類型必須是 REG_BINARY 類型,它有8個字節。左起前4個字節,是用16進制表示的像素寬度或高度,后4個字節保留,你應該設置為0。下面是一個可以在瀏覽器欄上顯示 HTML 文件的全部注冊表項目的例子,默認寬度為291(0x123)個像素點:

HKEY_CLASSES_ROOT
CLSID
{你的 Band 對象的 CLSID}

 (Default) = 菜單文字
 InProcServer32
  (Default) = DLL 的全路徑文件名
  ThreadingModel= Apartment
Instance
CLSID

  (Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}
InitPropertyBag
  Url= 你的 HTML 文件名

HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{你的 Band 對象的 CLSID}

  BarSize= 23 01 00 00 00 00 00 00

  對于注冊表的設置,用 ATL 實現其實是異常簡單的。打開工程的 xxx.rgs 文件,并手工編輯一下就可以了。 下面這個文件源碼,是例子程序中 IE 工具欄的注冊表樣式,HKLM 是需要手工添加的,因為它不使用組件類型方式注冊。而對于其它類型的 band 對象只要在類聲明中添加:

BEGIN_CATEGORY_MAP(Cxxx)			// 向注冊表中注冊 COM 類型
	IMPLEMENTED_CATEGORY(CATID_InfoBand)	// 垂直樣式的瀏覽器欄
END_CATEGORY_MAP()		
IE 工具欄類型 band 對象的“.rgs”文件
HKCR	// 這個項目是 ATL 幫你生成的,你只要手工修改“菜單上的文字”就可以了
{
	Bands.ToolBar.1 = s ''ToolBar Class''
	{
		CLSID = s ''{ 你的 CLSID }''
	}
	Bands.ToolBar = s ''ToolBar Class''
	{
		CLSID = s ''{ 你的 CLSID }''
		CurVer = s ''Bands.ToolBar.1''
	}
	NoRemove CLSID
	{
		ForceRemove { 你的 CLSID } = s ''用在菜單上的文字(&T)''
		{
			ProgID = s ''Bands.ToolBar.1''
			VersionIndependentProgID = s ''Bands.ToolBar''
			ForceRemove ''Programmable''
			InprocServer32 = s ''%MODULE%''
			{
				val ThreadingModel = s ''Apartment''
			}
			''TypeLib'' = s ''{xxxx-xxxx-xxxxxxxxxxxxxxx}''
		}
	}
}

HKLM	// 這個項目是手工添加的IE工具欄所特有的
{
	Software
	{
		Microsoft
		{
			''Internet Explorer''
			{
				NoRemove Toolbar
				{
					ForceRemove val { 你的 CLSID } = s ''隨便給個說明性文字串''
				}
			}
		}
	}
}		
四、 ATL 實現
  下載代碼后(VC 6.0 工程),請參照前面的說明仔細閱讀,代碼中也有一些關鍵點的注釋。如果想運行,則可以用 regsvr32.exe 進行注冊,然后打開 IE 瀏覽器或資源瀏覽器就可以看到效果了。如果想自己實踐一下,可以按照如下的步驟構造工程:

4.1 建立一個 ATL DLL 工程
4.2 添加 New ATL Object...,選擇 Internet Explorer Object,選這個類型的目的是讓向導給我們添加 IObjectWithSite 的支持。如果你使用的是 .net 環境,則不要忘記選擇支持這個接口。



4.3 輸入對象名稱,比如我想建立一個垂直的瀏覽器欄,不妨叫它 VerBar



4.4 線程模型必須選擇 Apartment,接口類型的選擇無所謂,看你想不想支持 IDispatch 接口功能了。在例子程序中的垂直瀏覽器欄中,由于想更簡單的操縱 IE 和從 IE 中接受事件(連接點),選擇 Dual 是必要的。聚合選項,你只要別選擇 Only 就可以了。



4.5 展現你無窮的智慧,開始輸入程序吧。如果是 Debug 方式編譯,可能會出現一個連接錯誤,報告找不到_AtlAxCreateControl,那么你要在菜單 Project\Settings...\Link 中增加對 Atl.lib 的連接。或者使用 #pragma comment ( lib, "atl" )加入連接庫。
4.6 如果想調試代碼,在菜單 Project\Settings...\Debug 中輸入 IE 的路徑名稱,比如:“C:\Program Files\Internet Explorer\IEXPLORE.EXE”,然后就可以跟蹤斷點調試了。 編譯和調試桌面工具欄的 band 對象,是非常麻煩的,因為計算機啟動時自動運行 Shell,而 Shell 就會加載活動的桌面對象。

五、結束語
好了,到這里,就到這里了。祝大家學習快樂^_^
posted on 2007-03-11 14:35 jay 閱讀(438) 評論(0)  編輯 收藏 引用 所屬分類: IE編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            男女精品网站| 久久亚裔精品欧美| 欧美福利精品| 亚洲精品视频啊美女在线直播| 久久久噜噜噜久久狠狠50岁| 欧美激情视频免费观看| 在线性视频日韩欧美| 国产美女诱惑一区二区| 久久久久久久一区二区三区| 久久不射中文字幕| 亚洲清纯自拍| 亚洲影院色在线观看免费| 国产精品v片在线观看不卡| 亚洲伊人一本大道中文字幕| 女人天堂亚洲aⅴ在线观看| 亚洲天堂偷拍| 1000部精品久久久久久久久| 欧美日韩国产色视频| 久久精品女人天堂| 在线午夜精品| 欧美激情一区二区三区在线视频观看| 欧美激情久久久久| 亚洲一区高清| 猛男gaygay欧美视频| 欧美一区二区三区四区视频| 亚洲经典三级| 欧美99在线视频观看| 亚洲精品日本| 亚洲人成高清| 亚洲欧美日韩在线播放| 亚洲午夜精品网| 在线视频欧美一区| 久久综合色婷婷| 久久久久久国产精品mv| 欧美日韩精品一区二区在线播放 | 亚洲欧美电影在线观看| 99pao成人国产永久免费视频| 欧美激情亚洲一区| 亚洲欧美中文字幕| 欧美精品免费播放| 欧美福利一区二区三区| 欧美mv日韩mv国产网站| 国产亚洲欧美aaaa| 国产一区日韩二区欧美三区| 国产视频久久| 狠狠色狠狠色综合日日tαg| 韩国精品久久久999| 亚洲欧美一区二区精品久久久| 国产精品99久久久久久宅男| 欧美va天堂| 欧美中文在线免费| 葵司免费一区二区三区四区五区| 国产精品久久久久久久久久ktv| 国产精品美女久久久久av超清 | 欧美不卡视频一区| 欧美日韩亚洲一区三区 | 亚洲精品系列| 亚洲国产精品成人久久综合一区| 亚洲福利专区| 亚洲精品一区二区三区不| 欧美成人精品一区| 久久黄金**| 韩国v欧美v日本v亚洲v| 老司机一区二区三区| 蘑菇福利视频一区播放| 欧美一区二区三区免费在线看| 国产乱人伦精品一区二区 | 日韩亚洲一区在线播放| 欧美日韩在线免费观看| 国产午夜精品全部视频播放| 亚洲欧美日韩国产中文| 久久这里有精品视频| 久久精品国产免费观看| 亚洲高清在线播放| 亚洲欧美伊人| 亚洲直播在线一区| 黄色成人在线网址| 亚洲国产高潮在线观看| 欧美日韩黄色大片| 亚洲欧美在线看| 久久riav二区三区| 最新日韩欧美| 久久免费精品视频| 一区二区电影免费观看| 久久亚洲精品伦理| 国产精品嫩草99av在线| 欧美在线观看视频| 亚洲看片网站| 国产精品免费视频xxxx| 久久久久久久综合色一本| 麻豆九一精品爱看视频在线观看免费| 亚洲日本视频| 亚洲欧美99| 亚洲精品免费一区二区三区| 亚洲色在线视频| 在线欧美福利| 亚洲靠逼com| 黄色免费成人| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品你懂的在线| 久久这里只有| 欧美小视频在线| 欧美大片免费| 国产欧美激情| 亚洲一级影院| 亚洲全部视频| 国产一区二区三区自拍| 亚洲精品国产精品乱码不99按摩| 国产精品日韩一区| 亚洲欧美国产高清| 亚洲国产精品久久人人爱蜜臀 | 国内精品视频久久| 中文av一区二区| 99re亚洲国产精品| 91久久中文字幕| 国产丝袜一区二区三区| 亚洲精选大片| 91久久精品美女高潮| 久久精品官网| 欧美夜福利tv在线| 久久黄色小说| 欧美在线观看网址综合| 欧美日韩精品二区| 亚洲国产精品视频一区| 悠悠资源网亚洲青| 亚洲第一精品久久忘忧草社区| 国产精品一香蕉国产线看观看| 亚洲精品一区久久久久久| 亚洲茄子视频| 欧美成人在线网站| 亚洲高清在线观看一区| 亚洲福利精品| 久久影院亚洲| 欧美二区不卡| 亚洲国产精品v| 久久在精品线影院精品国产| 久久久一本精品99久久精品66| 国产精品久久久爽爽爽麻豆色哟哟| 91久久极品少妇xxxxⅹ软件| 亚洲精品国产无天堂网2021| 免播放器亚洲一区| 亚洲黄色一区| 在线视频亚洲| 国产精品xxx在线观看www| 亚洲午夜久久久久久尤物| 性欧美长视频| 国产一区二区三区四区在线观看| 欧美一级理论性理论a| 久久伊人亚洲| 91久久综合亚洲鲁鲁五月天| 欧美激情中文字幕在线| av成人免费在线观看| 国产专区精品视频| 欧美专区在线| 欧美黄色视屏| 一区二区日韩精品| 国产欧美日韩精品一区| 久久久久免费观看| 亚洲激情视频| 欧美一区二区三区免费视频| 国内精品久久久久影院色| 欧美成人三级在线| 亚洲午夜视频在线| 免费亚洲一区| 国产日韩av一区二区| 久久精品九九| 最新日韩在线| 久久av在线| 欧美视频手机在线| 小黄鸭精品aⅴ导航网站入口| 在线亚洲电影| 国产一区二区三区在线免费观看| 美女主播一区| 亚洲图片在线| 农村妇女精品| 午夜精品久久| 另类尿喷潮videofree| 亚洲人成人一区二区三区| 一区二区成人精品| 国产精品视频免费观看www| 久久精品盗摄| 一二三四社区欧美黄| 久久综合久久综合九色| 亚洲免费福利视频| 久久久综合网站| 夜夜嗨一区二区| 久久尤物视频| 亚洲影院色无极综合| 亚洲国产一成人久久精品| 久久精品导航| 亚洲性人人天天夜夜摸| 亚洲国产精品久久久久秋霞蜜臀| 性欧美暴力猛交另类hd| 亚洲毛片视频| 亚洲第一精品久久忘忧草社区| 国产欧美精品一区二区三区介绍| 欧美激情精品久久久六区热门| 久久国产精品免费一区| 亚洲女人小视频在线观看| 日韩西西人体444www|