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

C++ Coder

HCP高性能計(jì)算架構(gòu),實(shí)現(xiàn),編譯器指令優(yōu)化,算法優(yōu)化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

本文摘自:http://www.vckbase.com/index.php/wv/1206

 

一、前言

上回書介紹了GUID、CLSID、IID和接口的概念。本回的重點(diǎn)是介紹 COM 中的數(shù)據(jù)類型。咋還不介紹組件程序的設(shè)計(jì)步驟呀?咳......別著急,別著急!孔子曰:“飯要一口一口地吃”;老子語(yǔ):“心急吃不了熱豆腐”,孫子云:“走一步看一步吧” ...... 先掌握必要的知識(shí),將來(lái)寫起程序來(lái)才會(huì)得心應(yīng)手也:-)

走入正題之前,請(qǐng)大家牢牢記住一條原則:COM 組件是運(yùn)行在分布式環(huán)境中的。比如,你寫了一個(gè)組件程序(DLL或EXE),那么使用者可能是在本機(jī)的某個(gè)進(jìn)程內(nèi)加載組件(INPROC_SERVER);也可能是從另一個(gè)進(jìn)程中調(diào)用組件的進(jìn)程(LOCAL_SERVER);也可能是在這臺(tái)計(jì)算機(jī)上調(diào)用地球那邊計(jì)算機(jī)上的組件(REMOTE_SERVER)。所以在理解和設(shè)計(jì)的時(shí)候,要時(shí)時(shí)刻刻想起這句話???!拿出小本本,記下來(lái)!

二、HRESULT 函數(shù)返回值

每個(gè)人在做程序設(shè)計(jì)的時(shí)候,都有他們各自的哲學(xué)思想。拿函數(shù)返回值來(lái)說(shuō),就有好多種形式。

函數(shù) 返回值 返回值信息
double sin(double)

浮點(diǎn)數(shù)值

計(jì)算正玄值
BOOL DeleteFile(LPCTSTR)

布爾值

文件刪除是否成功。如失敗,需要GetLastError()才能取得失敗原因
void * malloc(size_t)

內(nèi)存指針

內(nèi)存申請(qǐng),如果失敗,返回空指針 NULL
LONG RegDeleteKey(HKEY,LPCTSTR)

整數(shù)

刪除注冊(cè)表項(xiàng)。0表示成功,非0失敗,同時(shí)這個(gè)值就反映了失敗的原因
UINT DragQueryFile(HDROP,UINT,LPTSTR,UINT)

整數(shù)

取得拖放文件信息。以不同的參數(shù)調(diào)用,則返回不同的含義:
一會(huì)兒表示文件個(gè)數(shù),一會(huì)兒表示文件名長(zhǎng)度,一會(huì)兒表示字符長(zhǎng)度
...... ......

...

...... ......

 

 

如此紛繁復(fù)雜的返回值,如此含義多變的返回值,使得大家在學(xué)習(xí)和使用的過程中,增加了額外的困難。好了,COM 的設(shè)計(jì)規(guī)范終于對(duì)他們進(jìn)行了統(tǒng)一。組件API及接口指針中,除了IUnknown::AddRef()和IUnknown::Release()兩個(gè)函數(shù)外,其它所有的函數(shù),都以 HRESULT 作為返回值。大家想象一個(gè)組件的接口函數(shù)比如叫Add(),完成2個(gè)整數(shù)的加法運(yùn)算,在C語(yǔ)言中,我們可以如下定義:

  1. long Add( long n1, long n2 )  
  2. {  
  3. return n1 + n2;  
  4. }  

還記得剛才我們說(shuō)的原則嗎?COM 組件是運(yùn)行在分布式環(huán)境中的。也就是說(shuō),這個(gè)函數(shù)可能運(yùn)行在“地球另一邊”的計(jì)算機(jī)上,既然運(yùn)行在那么遙遠(yuǎn)的地方,就有可能出現(xiàn)服務(wù)器關(guān)機(jī)、網(wǎng)絡(luò)掉線、運(yùn)行超時(shí)、對(duì)方不在服務(wù)區(qū)......等異常。于是,這個(gè)加法函數(shù),除了需要返回運(yùn)算結(jié)果以外,還應(yīng)該返回一個(gè)值------函數(shù)是否被正常執(zhí)行了。

  1. HRESULT Add( long n1, long n2, long *pSum )  
  2. {  
  3. 3*pSum = n1 + n2;  
  4.  return S_OK;  
  5. }  

如果函數(shù)正常執(zhí)行,則返回 S_OK,同時(shí)真正的函數(shù)運(yùn)行結(jié)果則通過參數(shù)指針返回。如果遇到了異常情況,則COM系統(tǒng)經(jīng)過判斷,會(huì)返回相應(yīng)的錯(cuò)誤值。常見的返回值有:

HRESULT 含義
S_OK 0x00000000 成功
S_FALSE 0x00000001 函數(shù)成功執(zhí)行完成,但返回時(shí)出現(xiàn)錯(cuò)誤
E_INVALIDARG 0x80070057 參數(shù)有錯(cuò)誤
E_OUTOFMEMORY 0x8007000E 內(nèi)存申請(qǐng)錯(cuò)誤
E_UNEXPECTED 0x8000FFFF 未知的異常
E_NOTIMPL 0x80004001 未實(shí)現(xiàn)功能
E_FAIL 0x80004005 沒有詳細(xì)說(shuō)明的錯(cuò)誤。一般需要取得 Rich Error 錯(cuò)誤信息(注1)
E_POINTER 0x80004003 無(wú)效的指針
E_HANDLE 0x80070006 無(wú)效的句柄
E_ABORT 0x80004004 終止操作
E_ACCESSDENIED 0x80070005 訪問被拒絕
E_NOINTERFACE 0x80004002 不支持接口

圖一、HRESULT 的結(jié)構(gòu)

HRESULT 其實(shí)是一個(gè)雙字節(jié)的值,其最高位(bit)如果是0表示成功,1表示錯(cuò)誤。具體參見 MSDN 之"Structure of COM Error Codes"說(shuō)明。我們?cè)诔绦蛑腥绻枰袛喾祷刂?,則可以使用比較運(yùn)算符號(hào);switch開關(guān)語(yǔ)句;也可以使用VC提供的宏:

  1. HRESULT hr = 調(diào)用組件函數(shù);  
  2. if( SUCCEEDED( hr ) ){...} // 如果成功  
  3. ......  
  4. if( FAILED( hr ) ){...} // 如果失敗  
  5. ......  

三、UNICODE

計(jì)算機(jī)發(fā)明后,為了在計(jì)算機(jī)中表示字符,人們制定了一種編碼,叫ASCII碼。ASCII碼由一個(gè)字節(jié)中的7位(bit)表示,范圍是0x00 - 0x7F 共128個(gè)字符。他們以為這128個(gè)數(shù)字就足夠表示abcd....ABCD....1234 這些字符了。

咳......說(shuō)英語(yǔ)的人就是“笨”!后來(lái)他們突然發(fā)現(xiàn),如果需要按照表格方式打印這些字符的時(shí)候,缺少了“制表符”。于是又?jǐn)U展了ASCII的定義,使用一個(gè)字節(jié)的全部8位(bit)來(lái)表示字符了,這就叫擴(kuò)展ASCII碼。范圍是0x00 - 0xFF 共256個(gè)字符。

咳......說(shuō)中文的人就是聰明!中國(guó)人利用連續(xù)2個(gè)擴(kuò)展ASCII碼的擴(kuò)展區(qū)域(0xA0以后)來(lái)表示一個(gè)漢字,該方法的標(biāo)準(zhǔn)叫GB-2312。后來(lái),日文、韓文、阿拉伯文、臺(tái)灣繁體(BIG-5)......都使用類似的方法擴(kuò)展了本地字符集的定義,現(xiàn)在統(tǒng)一稱為 MBCS 字符集(多字節(jié)字符集)。這個(gè)方法是有缺陷的,因?yàn)楦鱾€(gè)國(guó)家地區(qū)定義的字符集有交集,因此使用GB-2312的軟件,就不能在BIG-5的環(huán)境下運(yùn)行(顯示亂碼),反之亦然。

咳......說(shuō)英語(yǔ)的人終于變“聰明”一些了。為了把全世界人民所有的所有的文字符號(hào)都統(tǒng)一進(jìn)行編碼,于是制定了UNICODE標(biāo)準(zhǔn)字符集。UNICODE 使用2個(gè)字節(jié)表示一個(gè)字符(unsigned shor int、WCHAR、_wchar_t、OLECHAR)。這下終于好啦,全世界任何一個(gè)地區(qū)的軟件,可以不用修改地就能在另一個(gè)地區(qū)運(yùn)行了。雖然我用 IE 瀏覽日本網(wǎng)站,顯示出我不認(rèn)識(shí)的日文文字,但至少不會(huì)是亂碼了。UNICODE 的范圍是 0x0000 - 0xFFFF 共6萬(wàn)多個(gè)字符,其中光漢字就占用了4萬(wàn)多個(gè)。嘿嘿,中國(guó)人賺大發(fā)了:0)

在程序中使用各種字符集的方法:

  1. const char * p = "Hello"// 使用 ASCII 字符集  
  2. const char * p = "你好"// 使用 MBCS 字符集,由于 MBCS 完全兼容 ASCII,多數(shù)情況下,我們并不嚴(yán)格區(qū)分他們  
  3. LPCSTR p = "Hello,你好"// 意義同上  
  4.   
  5. const WCHAR * p = L"Hello,你好"// 使用 UNICODE 字符集  
  6. LPCOLESTR p = L"Hello,你好"// 意義同上  
  7.   
  8. // 如果預(yù)定義了_UNICODE,則表示使用UNICODE字符集;如果定義了_MBCS,則表示使用 MBCS  
  9. const TCHAR * p = _T("Hello,你好");   
  10. LPCTSTR p = _T("Hello,你好"); // 意義同上  

在上面的例子中,T是非常有意思的一個(gè)符號(hào)(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一種中間類型,既不明確表示使用 MBCS,也不明確表示使用 UNICODE。那到底使用哪種字符集那?嘿嘿......編譯的時(shí)候決定吧。設(shè)置條件編譯的方式是:VC6中,"Project\Settings...\C/C++卡片 Preprocessor definitions" 中添加或修改 _MBCS、_UNICODE;VC.NET中,"項(xiàng)目\屬性\配置屬性\常規(guī)\字符集"然后用組合窗進(jìn)行選擇。使用 T 類型,是非常好的習(xí)慣,嚴(yán)重推薦!

四、BSTR

COM 中除了使用一些簡(jiǎn)單標(biāo)準(zhǔn)的數(shù)據(jù)類型外(注2),字符串類型需要特別重點(diǎn)地說(shuō)明一下。還記得原則嗎?COM 組件是運(yùn)行在分布式環(huán)境中的。通俗地說(shuō),你不能直接把一個(gè)內(nèi)存指針直接作為參數(shù)傳遞給COM函數(shù)。你想想,系統(tǒng)需要把這塊內(nèi)存的內(nèi)容傳遞到“地球另一 邊”的計(jì)算機(jī)上,因此,我至少需要知道你這塊內(nèi)存的尺寸吧?不然讓我如何傳遞呀?傳遞多少字節(jié)呀?!而字符串又是非常常用的一種類型,因此 COM 設(shè)計(jì)者引入了 BASIC 中字符串類型的表示方式---BSTR。BSTR 其實(shí)是一個(gè)指針類型,它的內(nèi)存結(jié)構(gòu)是:(輸入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");斷點(diǎn)執(zhí)行,然后觀察p的內(nèi)存)

圖二、BSTR 內(nèi)存結(jié)構(gòu)

BSTR 是一個(gè)指向 UNICODE 字符串的指針,且 BSTR 向前的4個(gè)字節(jié)中,使用DWORD保存著這個(gè)字符串的字節(jié)長(zhǎng)度( 沒有含字符串的結(jié)束符)。因此系統(tǒng)就能夠正確處理并傳送這個(gè)字符串到“地球另一 邊”了。特別需要注意的是,由于BSTR的指針就是指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用,但一定要注意:

有函數(shù) fun(LPCOLESTR lp),則你調(diào)用 BSTR p=...; fun(p); 正確

有函數(shù) fun(const BSTR bstr),則你調(diào)用 LPCOLESTR p=...; fun(p); 錯(cuò)誤?。?!

有關(guān) BSTR 的處理函數(shù):

API 函數(shù) 說(shuō)明
SysAllocString() 申請(qǐng)一個(gè) BSTR 指針,并初始化為一個(gè)字符串
SysFreeString() 釋放 BSTR 內(nèi)存
SysAllocStringLen() 申請(qǐng)一個(gè)指定字符長(zhǎng)度的 BSTR 指針,并初始化為一個(gè)字符串
SysAllocStringByteLen() 申請(qǐng)一個(gè)指定字節(jié)長(zhǎng)度的 BSTR 指針,并初始化為一個(gè)字符串
SysReAllocStringLen() 重新申請(qǐng) BSTR 指針

CString 函數(shù)

說(shuō)明

AllocSysString() 從 CString 得到 BSTR
SetSysString() 重新申請(qǐng) BSTR 指針,并復(fù)制到 CString 中

CComBSTR 函數(shù)

ATL 的 BSTR 包裝類。在 atlbase.h 中定義

Append()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper()
運(yùn)算符重載:!,!=,==,<,>,&,+=,+,=,BSTR
太多了,但從函數(shù)名稱不能看出其基本功能。詳細(xì)資料,查看MSDN 吧。另外,左側(cè)函數(shù),有很多是 ATL 7.0 提供的,VC6.0 下所帶的 ATL 3.0 不支持。
由于我們將來(lái)主要用 ATL 開發(fā)組件程序,因此使用 ATL 的 CComBSTR 為主。VC也提供了其它的包裝類 _bstr_t。

五、各種字符串類型之間的轉(zhuǎn)換

1、函數(shù) WideCharToMultiByte(),轉(zhuǎn)換 UNICODE 到 MBCS。使用范例:

  1.     LPCOLESTR lpw = L"Hello,你好";  
  2.     size_t wLen = wcslen( lpw ) + 1;  // 寬字符字符長(zhǎng)度,+1表示包含字符串結(jié)束符  
  3.       
  4.     int aLen=WideCharToMultiByte(  // 第一次調(diào)用,計(jì)算所需 MBCS 字符串字節(jié)長(zhǎng)度  
  5. CP_ACP,  
  6. 0,  
  7. lpw,  // 寬字符串指針  
  8. wLen, // 字符長(zhǎng)度  
  9. NULL,  
  10. 0,  // 參數(shù)0表示計(jì)算轉(zhuǎn)換后的字符空間  
  11. NULL,  
  12. NULL);  
  13.   
  14.     LPSTR lpa = new char [aLen];  
  15.   
  16.     WideCharToMultiByte(  
  17. CP_ACP,  
  18. 0,  
  19. lpw,  
  20. wLen,  
  21. lpa,  // 轉(zhuǎn)換后的字符串指針  
  22. aLen, // 給出空間大小  
  23. NULL,  
  24. NULL);  
  25.   
  26.     // 此時(shí),lpa 中保存著轉(zhuǎn)換后的 MBCS 字符串  
  27.     ... ... ... ...  
  28.     delete [] lpa;  

2、函數(shù) MultiByteToWideChar(),轉(zhuǎn)換 MBCS 到 UNICODE。使用范例:

  1.     LPCSTR lpa = "Hello,你好";  
  2.     size_t aLen = strlen( lpa ) + 1;  
  3.       
  4.     int wLen = MultiByteToWideChar(  
  5. CP_ACP,  
  6. 0,  
  7. lpa,  
  8. aLen,  
  9. NULL,  
  10. 0);  
  11.       
  12.     LPOLESTR lpw = new WCHAR [wLen];  
  13.     MultiByteToWideChar(  
  14. CP_ACP,  
  15. 0,  
  16. lpa,  
  17. aLen,  
  18. lpw,  
  19. wLen);  
  20.     ... ... ... ...  
  21.     delete [] lpw;  

3、使用 ATL 提供的轉(zhuǎn)換宏。

A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T

上表中的宏函數(shù),其實(shí)非常容易記憶:

2 好搞笑的縮寫,to 的發(fā)音和 2 一樣,所以借用來(lái)表示“轉(zhuǎn)換為、轉(zhuǎn)換到”的含義。
A ANSI 字符串,也就是 MBCS。
W、OLE 寬字符串,也就是 UNICODE。
T 中間類型T。如果定義了 _UNICODE,則T表示W(wǎng);如果定義了 _MBCS,則T表示A
C const 的縮寫

使用范例:

  1. #include < atlconv.h >  
  2.   
  3. void fun()  
  4. {  
  5.     USES_CONVERSION;  // 只需要調(diào)用一次,就可以在函數(shù)中進(jìn)行多次轉(zhuǎn)換  
  6.       
  7.     LPCTSTR lp = OLE2CT( L"Hello,你好") );  
  8.     ... ... ... ...  
  9.     // 不用顯式釋放 lp 的內(nèi)存,因?yàn)?/span>  
  10.     // 由于 ATL 轉(zhuǎn)換宏使用棧作為臨時(shí)空間,函數(shù)結(jié)束后會(huì)自動(dòng)釋放??臻g。  
  11. }  

使用 ATL 轉(zhuǎn)換宏,由于不用釋放臨時(shí)空間,所以使用起來(lái)非常方便。但是考慮到??臻g的尺寸(VC 默認(rèn)2M),使用時(shí)要注意幾點(diǎn):

1、只適合于進(jìn)行短字符串的轉(zhuǎn)換;

2、不要試圖在一個(gè)次數(shù)比較多的循環(huán)體內(nèi)進(jìn)行轉(zhuǎn)換;

3、不要試圖對(duì)字符型文件內(nèi)容進(jìn)行轉(zhuǎn)換,因?yàn)槲募叽缫话闱闆r下是比較大的;

4、對(duì)情況 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

六、VARIANT

C++、BASIC、Java、Pascal、Script......計(jì)算機(jī)語(yǔ)言多種多樣,而它們各自又都有自己的數(shù)據(jù)類型,COM 產(chǎn)生目的,其中之一就是要跨語(yǔ)言(注3)。而 VARIANT 數(shù)據(jù)類型就具有跨語(yǔ)言的特性,同時(shí)它可以表示(存儲(chǔ))任意類型的數(shù)據(jù)。從C語(yǔ)言的角度來(lái)講,VARIANT 其實(shí)是一個(gè)結(jié)構(gòu),結(jié)構(gòu)中用一個(gè)域(vt)表示------該變量到底表示的是什么類型數(shù)據(jù),同時(shí)真正的數(shù)據(jù)則存貯在 union 空間中。結(jié)構(gòu)的定義太長(zhǎng)了(雖然長(zhǎng),但其實(shí)很簡(jiǎn)單)大家去看 MSDN 的描述吧,這里給出如何使用的簡(jiǎn)單示例:

學(xué)生:我想用 VARIANT 表示一個(gè)4字節(jié)長(zhǎng)的整數(shù),如何做?

老師:VARIANT v; v.vt=VT_I4; v.lVal=100;

學(xué)生:我想用 VARIANT 表示布爾值“真”,如何做?

老師:VARIANT v; v.vt=VT_BOOL; v.boolVal=VARIANT_TRUE;

學(xué)生:這么麻煩?我能不能 v.boolVal=true; 這樣寫?

老師:不可以!因?yàn)椤?

類型 字節(jié)長(zhǎng)度 假值 真值
bool 1(char) 0(false) 1(true)
BOOL 4(int) 0(FALSE) 1(TRUE)
VT_BOOL 2(short int) 0(VARIANT_FALSE) -1(VARIANT_TRUE)

所以如果你 v.boolVal=true 這樣賦值,那么將來(lái) if(VARIANT_TRUE==v.boolVal) 的時(shí)候會(huì)出問題(-1 != 1)。但是你注意觀察,任何布爾類型的“假”都是0,因此作為一個(gè)好習(xí)慣,在做布爾判斷的時(shí)候,不要和“真值”相比較,而要與“假值”做比較。

學(xué)生:謝謝老師,你太牛了。我對(duì)老師的敬仰如滔滔江水,連綿不絕......

學(xué)生:我想用 VARIANT 保存字符串,如何做?

老師:VARIANT v; v.vt=VT_BSTR; v.bstrVal=SysAllocString(L"Hello,你好");

學(xué)生:哦......我明白了??墒沁@么操作真夠麻煩的,有沒有簡(jiǎn)單一些的方法?

老師:有呀,你可以使用現(xiàn)成的包裝類 CComVariant、COleVariant、_variant_t。比如上面三個(gè)問題就可以這樣書寫:CComVariant v1(100),v2(true),v3("Hello,你好"); 簡(jiǎn)單了吧?!(注4)

學(xué)生:老師,我再問最后一個(gè)問題,我如何用 VARIANT 保存一個(gè)數(shù)組?

老師:這個(gè)問題很復(fù)雜,我現(xiàn)在不能告訴你,我現(xiàn)在告訴你怕你印象不深......(注5)

學(xué)生:~!@#$%^&*()......暈!

七、小結(jié)

以上所介紹的內(nèi)容,是基本功,必須熟練掌握。先到這里吧,休息一會(huì)兒......更多精彩內(nèi)容,敬請(qǐng)關(guān)注《COM 組件設(shè)計(jì)與應(yīng)用(四)》


注1:在后續(xù)的 ISupportErrorInfo 接口中介紹。

注2:常見的數(shù)據(jù)類型,請(qǐng)參考 IDL 文件的說(shuō)明。(別著急,還沒寫那......嘿嘿)

注3:跨語(yǔ)言就是各種語(yǔ)言中都能使用COM組件。但啥時(shí)候能跨平臺(tái)呢?

注4:CComVariant/COlevariant/_variant_t 請(qǐng)參看 MSDN。

注5:關(guān)于安全數(shù)組 SafeArray 的使用,在后續(xù)的文章中討論。

posted on 2012-10-17 22:52 jackdong 閱讀(444) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美a级理论片| 亚洲主播在线观看| 欧美日韩视频在线观看一区二区三区| 欧美一级在线播放| 欧美在线视频免费观看| 午夜视频久久久| 亚洲欧洲精品一区二区精品久久久| 亚洲国产精品成人| 亚洲激情av在线| 亚洲精品日日夜夜| 亚洲视频二区| 欧美一区二区福利在线| 久久色中文字幕| 久久尤物视频| 欧美日韩国产探花| 国产欧美日韩精品专区| 国产性猛交xxxx免费看久久| 在线精品视频在线观看高清| 亚洲黄网站黄| 亚洲综合三区| 美女久久一区| 亚洲美女黄色| 亚洲欧美日韩一区二区| 免播放器亚洲| 国产精品一区二区久久久久| 1024国产精品| 亚洲女女做受ⅹxx高潮| 免费观看国产成人| 日韩亚洲欧美综合| 久久国产精品亚洲77777| 欧美精品一区二区三区久久久竹菊 | 亚洲欧美区自拍先锋| 久久美女性网| 国产美女精品视频| 亚洲最新在线视频| 欧美77777| 欧美一区二区三区免费观看| 欧美激情一区二区三区四区 | 国产视频久久久久久久| 亚洲精品免费一区二区三区| 欧美在线视频全部完| 亚洲国产一区二区精品专区| 香港久久久电影| 国产精品videosex极品| 日韩视频中文字幕| 欧美激情在线观看| 噜噜噜久久亚洲精品国产品小说| 国产亚洲精品久| 亚洲女优在线| 日韩视频不卡中文| 免费国产一区二区| 伊人婷婷久久| 久久亚洲美女| 久久国产婷婷国产香蕉| 国产日韩精品一区二区| 亚洲欧美高清| 国产精品99久久久久久久久 | 欧美亚洲网站| 国产精品精品视频| 亚洲一级片在线看| 亚洲精品一区久久久久久| 玖玖玖免费嫩草在线影院一区| 国产亚洲激情在线| 久久精品国产精品亚洲| 一区二区久久| 国产精品免费小视频| 午夜国产精品视频免费体验区| 亚洲免费大片| 国产精品theporn88| 香蕉成人伊视频在线观看| 一本色道**综合亚洲精品蜜桃冫 | 99热免费精品| 国产精品羞羞答答| 久久久7777| 久久蜜桃精品| 亚洲蜜桃精久久久久久久| 亚洲另类视频| 国产色综合久久| 欧美肥婆bbw| 欧美伦理91i| 欧美一区二区视频97| 久久精品99久久香蕉国产色戒| 亚洲大胆女人| av成人老司机| 国内揄拍国内精品少妇国语| 免费在线欧美黄色| 欧美大片一区二区三区| 亚洲专区欧美专区| 久久免费高清| 亚洲一区二区三区午夜| 午夜精品视频在线观看| 亚洲国产精品成人综合| 99精品视频一区二区三区| 国产日韩欧美一区| 亚洲国产导航| 国产精品一区二区男女羞羞无遮挡 | 日韩午夜激情| 午夜精品久久久久久久99樱桃| 亚洲国产成人精品久久| 亚洲午夜高清视频| 亚洲韩国精品一区| 午夜在线一区二区| 亚洲精品中文字| 欧美一级淫片播放口| 一区二区久久| 欧美成人国产| 久久青青草综合| 国产精品亚洲成人| 亚洲三级免费观看| 一区二区三区在线免费播放| 亚洲免费电影在线| 亚洲激情在线播放| 亚洲一区三区视频在线观看 | 欧美成人精品| 国产精品视频网站| 亚洲日本在线观看| 影音先锋久久资源网| 一区二区三区精品| 亚洲精品一区二区三区99| 久久精品日韩一区二区三区| 午夜电影亚洲| 欧美日精品一区视频| 亚洲二区免费| 亚洲欧洲日本在线| 久久夜精品va视频免费观看| 性久久久久久久久久久久| 欧美日韩免费网站| 亚洲日韩成人| 一本色道久久综合| 欧美r片在线| 欧美福利视频网站| 1769国产精品| 美女脱光内衣内裤视频久久网站| 久久久中精品2020中文| 国产亚洲一区在线| 亚洲欧美国产高清va在线播| 午夜国产精品视频| 国产毛片一区二区| 午夜亚洲精品| 久久综合久久综合这里只有精品 | 欧美亚洲免费高清在线观看| 欧美午夜精品一区二区三区| av不卡在线观看| 欧美一区成人| 国产视频一区在线观看| 久久国内精品自在自线400部| 久久免费的精品国产v∧| 国产一区二区三区高清| 久久国产精品免费一区| 欧美高清在线| 亚洲最新色图| 国产精品尤物| 久久久九九九九| 91久久国产精品91久久性色| 亚洲视频欧美视频| 国产视频一区在线观看一区免费 | 国产美女搞久久| 久久亚洲捆绑美女| 亚洲精品一区二区三| 先锋影音久久| 亚洲成人资源网| 欧美午夜无遮挡| 欧美呦呦网站| 91久久精品久久国产性色也91| 亚洲专区在线视频| 狠狠色丁香婷综合久久| 欧美国产一区二区在线观看| 一区二区三区四区五区精品视频 | 免费观看亚洲视频大全| 亚洲最新中文字幕| 久久男女视频| 一区二区三区视频在线| 国产日韩欧美中文在线播放| 免费在线成人| 美日韩精品视频免费看| 一本到12不卡视频在线dvd| 国产精品伦一区| 蜜桃视频一区| 午夜日韩视频| 一本大道久久a久久综合婷婷| 久久影音先锋| 欧美一区影院| 亚洲视频自拍偷拍| 永久域名在线精品| 国产精品尤物| 国产精品成人久久久久| 另类国产ts人妖高潮视频| 亚洲你懂的在线视频| 日韩写真视频在线观看| 欧美国产一区视频在线观看| 久久av资源网站| 亚洲在线视频免费观看| 亚洲美女免费精品视频在线观看| 国内成人精品2018免费看| 欧美三级中文字幕在线观看| 欧美va亚洲va日韩∨a综合色| 久久国产精品99国产| 亚洲永久免费av| 9人人澡人人爽人人精品| 亚洲人线精品午夜|