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

VC++動(dòng)態(tài)鏈接庫(kù)編程之MFC擴(kuò)展 DLL

前文我們對(duì)非MFC DLL和MFC規(guī)則DLL進(jìn)行了介紹,現(xiàn)在開始詳細(xì)分析DLL的最后一種類型――MFC擴(kuò)展DLL。

  6.1概論

  MFC擴(kuò)展DLL與MFC規(guī)則DLL的相同點(diǎn)在于在兩種DLL的內(nèi)部都可以使用MFC類庫(kù),其不同點(diǎn)在于MFC擴(kuò)展DLL與應(yīng)用程序的接口可以是MFC的。MFC擴(kuò)展DLL的含義在于它是MFC的擴(kuò)展,其主要功能是實(shí)現(xiàn)從現(xiàn)有MFC庫(kù)類中派生出可重用的類。MFC擴(kuò)展DLL使用MFC 動(dòng)態(tài)鏈接庫(kù)版本,因此只有用共享MFC 版本生成的MFC 可執(zhí)行文件(應(yīng)用程序或規(guī)則DLL)才能使用MFC擴(kuò)展DLL。

  從前文可知,MFC規(guī)則DLL被MFC向?qū)ё詣?dòng)添加了一個(gè)CWinApp的對(duì)象,而MFC擴(kuò)展DLL則不包含該對(duì)象,它只是被自動(dòng)添加了DllMain 函數(shù)。對(duì)于MFC擴(kuò)展DLL,開發(fā)人員必須在DLL的DllMain函數(shù)中添加初始化和結(jié)束代碼。

  從下表我們可以看出三種DLL對(duì)DllMain入口函數(shù)的不同處理方式:

DLL類型 入口函數(shù)
非 MFC DLL 編程者提供DllMain函數(shù)
MFC規(guī)則 DLL CWinApp對(duì)象的InitInstance 和 ExitInstance
MFC擴(kuò)展 DLL MFC DLL向?qū)蒁llMain 函數(shù)

  對(duì)于MFC擴(kuò)展DLL,系統(tǒng)會(huì)自動(dòng)在工程中添加如下表所示的宏,這些宏為DLL和應(yīng)用程序的編寫提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA這樣的宏,在DLL和應(yīng)用程序中將具有不同的定義,這取決于_AFXEXT宏是否被定義。這使得在DLL和應(yīng)用程序中,使用統(tǒng)一的一個(gè)宏就可以表示出輸出和輸入的不同意思。在DLL中,表示輸出(因?yàn)開AFXEXT被定義,通常是在編譯器的標(biāo)識(shí)參數(shù)中指定/D_AFXEXT);在應(yīng)用程序中,則表示輸入(_AFXEXT沒有定義)。

定義
AFX_CLASS_IMPORT __declspec(dllexport)
AFX_API_IMPORT __declspec(dllexport)
AFX_DATA_IMPORT __declspec(dllexport)
AFX_CLASS_EXPORT __declspec(dllexport)
AFX_API_EXPORT __declspec(dllexport)
AFX_DATA_EXPORT __declspec(dllexport)
AFX_EXT_CLASS #ifdef _AFXEXT
 AFX_CLASS_EXPORT
#else
 AFX_CLASS_IMPORT
AFX_EXT_API #ifdef _AFXEXT
 AFX_API_EXPORT
#else
 AFX_API_IMPORT
AFX_EXT_DATA #ifdef _AFXEXT
 AFX_DATA_EXPORT
#else
 AFX_DATA_IMPORT

  6.2 MFC擴(kuò)展DLL導(dǎo)出MFC派生類

  在這個(gè)例子中,我們將產(chǎn)生一個(gè)名為“ExtDll”的MFC擴(kuò)展DLL工程,在這個(gè)DLL中導(dǎo)出一個(gè)對(duì)話框類,這個(gè)對(duì)話框類派生自MFC類CDialog。

  使用MFC向?qū)蒑FC擴(kuò)展DLL時(shí),系統(tǒng)會(huì)自動(dòng)添加如下代碼:

static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };
extern "C" int APIENTRY

DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )
{
 // Remove this if you use lpReserved

 UNREFERENCED_PARAMETER( lpReserved );

 //說(shuō)明:lpReserved是一個(gè)被系統(tǒng)所保留的參數(shù),對(duì)于隱式鏈接是一個(gè)非零值,對(duì)于顯式鏈接值是零

 if (dwReason == DLL_PROCESS_ATTACH)
 {
  TRACE0( "EXTDLL.DLL Initializing!\n" );
  // Extension DLL one-time initialization
  if ( !AfxInitExtensionModule( ExtDllDLL, hInstance ))
   return 0;
   // Insert this DLL into the resource chain
  new CDynLinkLibrary( ExtDllDLL );
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  TRACE0( "EXTDLL.DLL Terminating!\n" );
  // Terminate the library before destructors are called
  AfxTermExtensionModule( ExtDllDLL );
 }
 return 1; // ok
}

  這一段代碼含義晦澀,我們需要對(duì)其進(jìn)行解讀:

  (1)上述代碼完成MFC擴(kuò)展DLL的初始化和終止處理;

  (2)初始化期間所創(chuàng)建的 CDynLinkLibrary 對(duì)象使MFC擴(kuò)展 DLL 可以將 DLL中的CRuntimeClass 對(duì)象或資源導(dǎo)出到應(yīng)用程序;

  (3)AfxInitExtensionModule函數(shù)捕獲模塊的CRuntimeClass 結(jié)構(gòu)和在創(chuàng)建 CDynLinkLibrary 對(duì)象時(shí)使用的對(duì)象工廠(COleObjectFactory 對(duì)象);

  (4)AfxTermExtensionModule函數(shù)使 MFC 得以在每個(gè)進(jìn)程與擴(kuò)展 DLL 分離時(shí)(進(jìn)程退出或使用AfxFreeLibrary卸載DLL時(shí))清除擴(kuò)展 DLL;

  (5)第一條語(yǔ)句static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };定義了一個(gè)AFX_EXTENSION_MODULE類的靜態(tài)全局對(duì)象,AFX_EXTENSION_MODULE的定義如下:

struct AFX_EXTENSION_MODULE
{
 BOOL bInitialized;
 HMODULE hModule;
 HMODULE hResource;
 CRuntimeClass* pFirstSharedClass;
 COleObjectFactory* pFirstSharedFactory;
};

  由AFX_EXTENSION_MODULE的定義我們可以更好的理解(2)、(3)、(4)點(diǎn)。

  在資源編輯器中添加一個(gè)如圖15所示的對(duì)話框,并使用MFC類向?qū)槠涮砑右粋€(gè)對(duì)應(yīng)的類CExtDialog,系統(tǒng)自動(dòng)添加了ExtDialog.h和ExtDialog.cpp兩個(gè)頭文件。


圖15 MFC擴(kuò)展DLL中的對(duì)話框

  修改ExtDialog.h中CExtDialog類的聲明為:

class AFX_EXT_CLASS CExtDialog : public CDialog
{
 public:
  CExtDialog( CWnd* pParent = NULL );
  enum { IDD = IDD_DLL_DIALOG };
 protected:
  virtual void DoDataExchange( CDataExchange* pDX );
  DECLARE_MESSAGE_MAP()
};

  這其中最主要的改變是我們?cè)赾lass AFX_EXT_CLASS CExtDialog語(yǔ)句中添加了“AFX_EXT_CLASS”宏,則使得DLL中的CExtDialog類被導(dǎo)出。
6.3 MFC擴(kuò)展DLL的加載

  6.3.1 隱式加載

  我們?cè)?.2工程所在的工作區(qū)中添加一個(gè)LoadExtDllDlg工程,用于演示MFC擴(kuò)展DLL的加載。在LoadExtDllDlg工程中添加一個(gè)如圖16所示的對(duì)話框,這個(gè)對(duì)話框上包括一個(gè)“調(diào)用DLL”按鈕。


圖16 MFC擴(kuò)展DLL調(diào)用工程中的對(duì)話框

  在與圖16對(duì)應(yīng)對(duì)話框類實(shí)現(xiàn)文件的頭部添加:

// LoadExtDllDlg.cpp : implementation file
//

#include "..\ExtDialog.h"
#pragma comment( lib, "ExtDll.lib" )

而“調(diào)用DLL”按鈕的單擊事件的消息處理函數(shù)為:

void CLoadExtDllDlg::OnDllcallButton()
{
 CExtDialog extDialog;
 extDialog.DoModal();
}

  當(dāng)我們單擊“調(diào)用DLL”的時(shí)候,彈出了如圖15的對(duì)話框。

  為提供給用戶隱式加載(MFC擴(kuò)展DLL一般使用隱式加載,具體原因見下節(jié)),MFC擴(kuò)展DLL需要提供三個(gè)文件:

  (1)描述DLL中擴(kuò)展類的頭文件;

  (2)與動(dòng)態(tài)鏈接庫(kù)對(duì)應(yīng)的.LIB文件;

  (3)動(dòng)態(tài)鏈接庫(kù).DLL文件本身。

  有了這三個(gè)文件,應(yīng)用程序的開發(fā)者才可充分利用MFC擴(kuò)展DLL。

  6.3.2 顯示加載

  顯示加載MFC擴(kuò)展DLL應(yīng)使用MFC全局函數(shù)AfxLoadLibrary而不是WIN32 API中的LoadLibrary。AfxLoadLibrary 最終也調(diào)用了 LoadLibrary這個(gè)API,但是在調(diào)用之前進(jìn)行了線程同步的處理。

  AfxLoadLibrary 的函數(shù)原型與 LoadLibrary完全相同,為:

HINSTANCE AFXAPI AfxLoadLibrary( LPCTSTR lpszModuleName );

  與之相對(duì)應(yīng)的是,MFC 應(yīng)用程序應(yīng)使用AfxFreeLibrary 而非FreeLibrary 卸載MFC擴(kuò)展DLL。AfxFreeLibrary的函數(shù)原型也與 FreeLibrary完全相同,為:

BOOL AFXAPI AfxFreeLibrary( HINSTANCE hInstLib );

  如果我們把上例中的“調(diào)用DLL”按鈕單擊事件的消息處理函數(shù)改為:

void CLoadExtDllDlg::OnDllcallButton()
{
 HINSTANCE hDll = AfxLoadLibrary( "ExtDll.dll" );
 if(NULL == hDll)
 {
  AfxMessageBox( "MFC擴(kuò)展DLL動(dòng)態(tài)加載失敗" );
  return;
 }

 CExtDialog extDialog;
 extDialog.DoModal();
 AfxFreeLibrary(hDll);
}

  則工程會(huì)出現(xiàn)link錯(cuò)誤:

LoadExtDllDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CExtDialog::~CExtDialog(void)" (__imp_??1CExtDialog@@UAE@XZ)

LoadExtDllDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall CExtDialog::CExtDialog(class CWnd *)" (__imp_??0CExtDialog@@QAE@PAVCWnd@@@Z)

  提示CExtDialog的構(gòu)造函數(shù)和析構(gòu)函數(shù)均無(wú)法找到!是的,對(duì)于派生MFC類的MFC擴(kuò)展DLL,當(dāng)我們要在應(yīng)用程序中使用DLL中定義的派生類時(shí),我們不宜使用動(dòng)態(tài)加載DLL的方法。

  6.4 MFC擴(kuò)展DLL加載MFC擴(kuò)展DLL

  我們可以在MFC擴(kuò)展DLL中再次使用MFC擴(kuò)展DLL,但是,由于在兩個(gè)DLL中對(duì)于AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA宏的定義都是輸出,這會(huì)導(dǎo)致調(diào)用的時(shí)候出現(xiàn)問題。

  我們將會(huì)在調(diào)用MFC擴(kuò)展DLL的DLL中看到link錯(cuò)誤:

error LNK2001: unresolved external symbol ….......

  因此,在調(diào)用MFC擴(kuò)展DLL的MFC擴(kuò)展DLL中,在包含被調(diào)用DLL的頭文件之前,需要臨時(shí)重新定義AFX_EXT_CLASS的值。下面的例子顯示了如何實(shí)現(xiàn):

//臨時(shí)改變宏的含義“輸出”為“輸入”

#undef AFX_EXT_CLASS
#undef AFX_EXT_API
#undef AFX_EXT_DATA
#define AFX_EXT_CLASS AFX_CLASS_IMPORT
#define AFX_EXT_API AFX_API_IMPORT
#define AFX_EXT_DATA AFX_DATA_IMPORT

//包含被調(diào)用MFC擴(kuò)展DLL的頭文件

#include "CalledDLL.h"

//恢復(fù)宏的含義為輸出

#undef AFX_EXT_CLASS
#undef AFX_EXT_API
#undef AFX_EXT_DATA
#define AFX_EXT_CLASS AFX_CLASS_EXPORT
#define AFX_EXT_API AFX_API_EXPORT
#define AFX_EXT_DATA AFX_DATA_EXPORT
6.5 MFC擴(kuò)展DLL導(dǎo)出函數(shù)和變量

  MFC擴(kuò)展DLL導(dǎo)出函數(shù)和變量的方法也十分簡(jiǎn)單,下面我們給出一個(gè)簡(jiǎn)單的例子。

  我們?cè)贛FC向?qū)傻腗FC擴(kuò)展DLL工程中添加gobal.h和global.cpp兩個(gè)文件:

//global.h:MFC擴(kuò)展DLL導(dǎo)出變量和函數(shù)的聲明

extern "C"
{
 int AFX_EXT_DATA total; //導(dǎo)出變量
 int AFX_EXT_API add( int x, int y ); //導(dǎo)出函數(shù)
}

//global.cpp:MFC擴(kuò)展DLL導(dǎo)出變量和函數(shù)定義

#include "StdAfx.h"
#include "global.h"

extern "C" int total;
int add(int x,int y)
{
 total = x + y;
 return total;
}

  編寫一個(gè)簡(jiǎn)單的控制臺(tái)程序來(lái)調(diào)用這個(gè)MFC擴(kuò)展DLL:

#include <iostream.h>
#include <afxver_.h>

//AFX_EXT_DATA、AFX_EXT_API宏的定義在afxver_.h頭文件中

#pragma comment ( lib, "ExtDll.lib" )
#include "..\global.h"

int main(int argc, char* argv[])
{
 cout << add(2,3) << endl;
 cout << total;
 return 0;
}

  運(yùn)行程序,在控制臺(tái)上看到:

  5

  5

  另外,在Visual C++下建立MFC擴(kuò)展DLL時(shí),MFC DLL向?qū)?huì)自動(dòng)生成.def文件。因此,對(duì)于函數(shù)和變量,我們除了可以利用AFX_EXT_DATA、AFX_EXT_API宏導(dǎo)出以外,在.def文件中定義導(dǎo)出也是一個(gè)很好的辦法。與之相比,在.def文件中導(dǎo)出類卻較麻煩。通常需要從工程生成的.map文件中獲得類的所有成員函數(shù)被C++編譯器更改過(guò)的標(biāo)識(shí)符,并且在.def文件中導(dǎo)出這些“奇怪”的標(biāo)識(shí)符。因此,MFC擴(kuò)展DLL通常以AFX_EXT_CLASS宏直接聲明導(dǎo)出類。

  6.6 MFC擴(kuò)展DLL的應(yīng)用

  上述各小節(jié)所舉MFC擴(kuò)展DLL的例子均只是為了說(shuō)明某方面的問題,沒有真實(shí)地體現(xiàn)“MFC擴(kuò)展” 的內(nèi)涵,譬如6.2派生自CDialog的類也不具備比CDialog更強(qiáng)的功能。MFC擴(kuò)展DLL的真實(shí)內(nèi)涵體現(xiàn)在它提供的類雖然派生自MFC類,但是提供了比MFC類更強(qiáng)大的功能、更豐富的接口。下面我們來(lái)看一個(gè)具體的例子(單擊此處下載本工程)。

  我們知道static控件所對(duì)應(yīng)的CStatic類不具備設(shè)置背景和文本顏色的接口,這使得我們不能在對(duì)話框或其它用戶界面上自由靈活地修改static控件的顏色風(fēng)格,因此我們需要一個(gè)提供了SetBackColor和SetTextColor接口的CStatic派生類CMultiColorStatic。
 
  這個(gè)類的聲明如下:

class AFX_EXT_CLASS CMultiColorStatic : public CStatic
{
 // Construction

 public:
  CMultiColorStatic();
  virtual ~CMultiColorStatic();
  // Attributes
 protected:
  CString m_strCaption;
  COLORREF m_BackColor;
  COLORREF m_TextColor;
  // Operations
 public:
  void SetTextColor( COLORREF TextColor );
  void SetBackColor( COLORREF BackColor );
  void SetCaption( CString strCaption );

  // Generated message map functions
 protected:
  afx_msg void OnPaint();
  DECLARE_MESSAGE_MAP()
};

  在這個(gè)類的實(shí)現(xiàn)文件中,我們需要為它提供WM_PAINT消息的處理函數(shù)(這是因?yàn)轭伾脑O(shè)置依賴于WM_PAINT消息):

BEGIN_MESSAGE_MAP(CMultiColorStatic, CStatic)

//{{AFX_MSG_MAP(CMultiColorStatic)
 ON_WM_PAINT() //為這個(gè)類定義WM_PAINT消息處理函數(shù)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

  下面是這個(gè)類中的重要成員函數(shù):

//為CMultiColorStatic類添加“設(shè)置文本顏色”接口

void CMultiColorStatic::SetTextColor( COLORREF TextColor )
{
 m_TextColor = TextColor; //設(shè)置文字顏色
}

//為CMultiColorStatic類添加“設(shè)置背景顏色”接口

void CMultiColorStatic::SetBackColor( COLORREF BackColor )
{
 m_BackColor = BackColor; //設(shè)置背景顏色
}

//為CMultiColorStatic類添加“設(shè)置標(biāo)題”接口

void CMultiColorStatic::SetCaption( CString strCaption )
{
 m_strCaption = strCaption;
}

//重畫Static,顏色和標(biāo)題的設(shè)置都依賴于這個(gè)函數(shù)

void CMultiColorStatic::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 CRect rect;
 GetClientRect( &rect );
 dc.SetBkColor( m_BackColor );
 dc.SetBkMode( TRANSPARENT );
 CFont *pFont = GetParent()->GetFont();//得到父窗體的字體
 CFont *pOldFont;
 pOldFont = dc.SelectObject( pFont );//選用父窗體的字體
 dc.SetTextColor( m_TextColor );//設(shè)置文本顏色
 dc.DrawText( m_strCaption, &rect, DT_CENTER );//文本在Static中央
 dc.SelectObject( pOldFont );
}

  為了驗(yàn)證CMultiColorStatic類,我們制作一個(gè)基于對(duì)話框的應(yīng)用程序,它包含一個(gè)如圖17所示的對(duì)話框。該對(duì)話框上包括一個(gè)static控件和三個(gè)按鈕,這三個(gè)按鈕可分別把static控件設(shè)置為“紅色”、“藍(lán)色”和“綠色”。


圖17 擴(kuò)展的CStatic類調(diào)用演示

  下面看看應(yīng)如何編寫與這個(gè)對(duì)話框?qū)?yīng)的類。

  包含這種Static的對(duì)話框類的聲明如下:

#include "..\MultiColorStatic.h"
#pragma comment ( lib, "ColorStatic.lib" )

// CCallDllDlg dialog

class CCallDllDlg : public CDialog
{
 public:
  CCallDllDlg(CWnd* pParent = NULL); // standard constructor
  enum { IDD = IDD_CALLDLL_DIALOG };
  CMultiColorStatic m_colorstatic; //包含一個(gè)CMultiColorStatic的實(shí)例
 protected:
  virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support
  HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(CCallDllDlg)

 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnRedButton();
 afx_msg void OnBlueButton();
 afx_msg void OnGreenButton();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

  下面是這個(gè)類中與使用CMultiColorStatic相關(guān)的主要成員函數(shù):

void CCallDllDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CCallDllDlg)
  DDX_Control(pDX, IDC_COLOR_STATIC, m_colorstatic);
 //使m_colorstatic與IDC_COLOR_STATIC控件關(guān)聯(lián)
 //}}AFX_DATA_MAP
}

BOOL CCallDllDlg::OnInitDialog()
{
 …
 // TODO: Add extra initialization here

 // 初始static控件的顯示

 m_colorstatic.SetCaption("最開始為黑色");
 m_colorstatic.SetTextColor(RGB(0,0,0));
 return TRUE; // return TRUE unless you set the focus to a control
}

//設(shè)置static控件文本顏色為紅色

void CCallDllDlg::OnRedButton()
{
 m_colorstatic.SetCaption( "改變?yōu)榧t色" );
 m_colorstatic.SetTextColor( RGB( 255, 0, 0 ) );
 Invalidate( TRUE ); //導(dǎo)致發(fā)出WM_PAINT消息
}

//設(shè)置static控件文本顏色為藍(lán)色

void CCallDllDlg::OnBlueButton()
{
 m_colorstatic.SetCaption( "改變?yōu)樗{(lán)色" );
 m_colorstatic.SetTextColor( RGB( 0, 0, 255 ) );
 Invalidate( TRUE ); //導(dǎo)致發(fā)出WM_PAINT消息
}

//設(shè)置static控件文本顏色為綠色

void CCallDllDlg::OnGreenButton()
{
 m_colorstatic.SetCaption( "改變?yōu)榫G色" );
 m_colorstatic.SetTextColor( RGB(0,255,0) );
 Invalidate( TRUE ); //導(dǎo)致發(fā)出WM_PAINT消息
}

  至此,我們已經(jīng)講解完成了所有類型的動(dòng)態(tài)鏈接庫(kù),即非MFC DLL、MFC規(guī)則DLL和MFC擴(kuò)展DLL。下一節(jié)將給出DLL的三個(gè)工程實(shí)例,與讀者朋友們共同體會(huì)DLL的應(yīng)用范圍和使用方法。

posted on 2009-06-09 21:17 wrh 閱讀(766) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統(tǒng)計(jì)

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            伊人天天综合| 欧美高清视频| 亚洲免费观看在线观看| 麻豆精品视频在线观看| 久久久国产视频91| 欧美一区三区三区高中清蜜桃| 亚洲主播在线播放| 久久久精品一区二区三区| 久久久久久亚洲综合影院红桃 | 欧美日韩成人综合在线一区二区 | 国产精品久久久久高潮| 国产精品青草久久| 亚洲国产欧美一区二区三区久久 | 国产欧美日韩在线 | 欧美www在线| 国产精品久久久久aaaa樱花| 韩国一区二区三区在线观看| 亚洲精品美女在线观看| 亚洲精品一级| 久久精品夜色噜噜亚洲aⅴ| 欧美成人一区在线| 国产一区二区精品久久99| 亚洲无限av看| 亚洲国产成人av| 久久久噜噜噜久久人人看| 欧美人牲a欧美精品| 亚洲国产第一页| 亚洲高清在线观看一区| 久久欧美肥婆一二区| 国产亚洲精品久久久久动| 亚洲综合99| 亚洲欧美日韩综合| 国产视频一区在线| 久久久精品视频成人| 久久精品五月| 黄网动漫久久久| 欧美激情四色| 欧美精品一区在线观看| 午夜精彩国产免费不卡不顿大片| 亚洲精品一区二区三区不| 国产精品日韩精品| 久久久精品欧美丰满| 欧美不卡一卡二卡免费版| aa级大片欧美三级| 狠狠干综合网| 99re热这里只有精品视频| 国产区欧美区日韩区| 亚洲国产精品一区二区三区| 国产精品成人v| 久久久午夜视频| 欧美激情aⅴ一区二区三区| 欧美gay视频激情| 性欧美大战久久久久久久久| 久久美女性网| 欧美亚洲日本国产| 欧美女同在线视频| 麻豆国产va免费精品高清在线| 欧美激情综合五月色丁香小说| 亚洲影音先锋| 欧美日本在线一区| 久久久中精品2020中文| 欧美视频精品一区| 亚洲二区在线| 亚洲成色999久久网站| 亚洲男女自偷自拍| 午夜精品视频网站| 欧美大片在线看免费观看| 看片网站欧美日韩| 国一区二区在线观看| 久久久精品日韩| 欧美成人国产一区二区| 在线看片一区| 欧美成人日本| 亚洲另类黄色| 亚洲欧美日韩在线不卡| 国产精品久久久久秋霞鲁丝| 亚洲一区3d动漫同人无遮挡| 99成人精品| 国产一区二区三区黄| 久久亚洲精品一区二区| 亚洲高清激情| 亚洲字幕在线观看| 伊人一区二区三区久久精品| 美女福利精品视频| 国产精品99久久久久久久久久久久| 午夜精品久久久久| 亚洲国产综合在线| 欧美亚州在线观看| 久久在线视频| 99视频精品免费观看| 国产一本一道久久香蕉| 欧美久久久久久| 久久―日本道色综合久久| 91久久精品国产91性色| 久久精品免费看| 亚洲愉拍自拍另类高清精品| 韩国v欧美v日本v亚洲v | 亚洲影音一区| 91久久国产自产拍夜夜嗨| 国产精品分类| 欧美日韩中文| 欧美成人免费观看| 久久偷窥视频| 蜜桃av一区二区三区| 午夜精品视频网站| 亚洲你懂的在线视频| 99在线视频精品| 日韩一级视频免费观看在线| 亚洲高清网站| 日韩天堂av| 宅男66日本亚洲欧美视频| 亚洲高清视频中文字幕| 蜜桃精品久久久久久久免费影院| 久久久免费精品视频| 久久久.com| 亚洲激情影视| 亚洲天堂网站在线观看视频| 一区二区三区精品视频| 99爱精品视频| 国产精品国产三级国产专播精品人 | 91久久国产综合久久蜜月精品| 国产精品白丝黑袜喷水久久久| 欧美日本国产| 国产精品一区亚洲| 激情综合网址| 亚洲精品视频免费| 亚洲综合视频1区| 免费在线欧美黄色| 一本色道久久综合亚洲91| 午夜精品久久久久| 欧美激情91| 悠悠资源网亚洲青| 一本大道久久a久久精二百| 久久av红桃一区二区小说| 亚洲国产一区二区三区a毛片| 亚洲另类一区二区| 鲁大师影院一区二区三区| 国产精品夜夜嗨| 亚洲在线观看免费视频| 亚洲国产精品一区制服丝袜 | 亚洲人成在线免费观看| 亚洲欧美日韩精品一区二区| 欧美激情一二区| 亚洲第一精品电影| 久久精品夜色噜噜亚洲aⅴ| 日韩一级在线| 欧美日韩午夜剧场| 亚洲少妇最新在线视频| 亚洲国产精品久久久久秋霞不卡| 欧美在线观看视频在线| 亚洲天堂av图片| 亚洲区第一页| 午夜一区二区三视频在线观看| 国产精品久久久久久久午夜| 欧美成人一区二区三区在线观看| 欧美激情精品久久久久| 久久国产加勒比精品无码| 久久国产福利| 日韩亚洲国产精品| 亚洲在线视频免费观看| 国产三级欧美三级日产三级99| 久久精品国产亚洲一区二区三区 | 制服丝袜激情欧洲亚洲| 亚洲精品欧美精品| 国产欧美日韩一区| 欧美激情亚洲国产| 国产精品综合久久久| 免费观看成人鲁鲁鲁鲁鲁视频| 久久久91精品国产一区二区精品| 99热免费精品| 欧美在线观看一区二区三区| 国产一区二区中文字幕免费看| 一区二区三区久久精品| 日韩视频三区| 欧美电影免费观看| 亚洲人成人99网站| 亚洲三级视频| 国产精品久久久久久久久久免费看| 久久手机精品视频| 一色屋精品视频在线观看网站| 亚洲视频1区2区| 欧美在线欧美在线| 国产精品久久久亚洲一区 | 欧美高清视频www夜色资源网| 国产精品女主播| 欧美资源在线| 亚洲精品一二区| 亚洲女ⅴideoshd黑人| 国产精品视频999| 亚洲免费在线观看视频| 欧美成人乱码一区二区三区| 亚洲视频福利| 亚洲精品看片| 亚洲高清三级视频| 亚洲深夜福利视频| 欧美人成在线视频| 亚洲国产天堂久久综合网| 亚洲一区二区欧美日韩| 亚洲精品久久7777| 亚洲三级电影全部在线观看高清|