3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】COM小结

發布時間:2023/12/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】COM小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:http://blog.csdn.net/byxdaz/article/details/6595210

一、Com概念

所謂COM(Componet Object Model,組件對象模型),是一種說明如何建立可動態互變組件的規范,此規范提供了為保證能夠互操作,客戶和組件應遵循的一些二進制和網絡標準。通過這種標準將可以在任意兩個組件之間進行通信而不用考慮其所處的操作環境是否相同、使用的開發語言是否一致以及是否運行于同一臺計算機。

在COM規范下將能夠以高度靈活的編程手段來開發、維護應用程序。可以將一個單獨的復雜程序劃分為多個獨立的模塊進行開發,這里的每一個獨立模塊都是一個自給自足的組件,可以采取不同的開發語言去設計每一個組件。在運行時將這些組件通過接口組裝起來以形成所需要的應用程序。構成應用程序的每一個組件都可以在不影響其他組件的前提下被升級。這里所說的組件是特指在二進制級別上進行集成和重用而能夠被獨立生產獲得和配置的軟件單元。COM規范所描述的即是如何編寫組件,遵循COM標準的任何一個組件都是可以被用來組合成應用程序的。至于對組件采取的是何種編程語言則是無關緊要的,可以自由選取。作為一個真正意義上的組件,應具備如下特征:
  1) 實現了對開發語言的封裝。
  2) 以二進制形式發布。
  3) 能夠在不妨礙已有用戶的情況下被升級。
  4) 在網絡上的位置必須能夠被透明的重新分配。
  這些特征使COM組件具有很好的可重用性,這種可重用性與DLL一樣都是建立在二進制基礎上的代碼重用。但是COM在多個方面的表現均要比DLL的重用方式好的多。例如,在DLL中存在的函數重名問題、各編譯器對C++函數名稱修飾的不兼容問題、路徑問題以及與可執行程序的依賴性問題等在COM中通過使用虛函數表、查找注冊表等手段均被很好的解決。其實COM組件在發布形式上本身就包擴DLL,只不過通過制訂復雜的COM規范,使COM本身的機制改變了重用的方法,能夠以一種新的方法來利用DLL并克服DLL本身所固有的一些缺陷,從而實現了更高層次的重用。

(1)函數重名問題
DLL里是一個一個的函數,我們通過函數名來調用函數,那如果兩個DLL里有重名的函數怎么辦?
(2)各編譯器對C++函數的名稱修飾不兼容問題
對于C++函數,編譯器要根據函數的參數信息為它生成修飾名,DLL庫里存的就是這個修飾名,但是不同的編譯器產生修飾的方法不一樣,所以你在VC里編寫的DLL在BC里就可以用不了。不過也可以用extern"C";來強調使用標準的C函數特性,關閉修飾功能,但這樣也喪失了C++的重載多態性功能。
(3)路徑問題
放在自己的目錄下面,別人的程序就找不到,放在系統目錄下,就可能有重名的問題。而真正的組件應該可以放在任何地方甚至可以不在本機,用戶根本不需考慮這個問題。
(4)DLL與EXE的依賴問題
我們一般都是用隱式連接的方式,就是編程的時侯指明用什么DLL,這種方式很簡單,它在編譯時就把EXE與DLL綁在一起了。如果DLL發行了一個新版本,我們很有必要重新鏈接一次,因為DLL里面函數的地址可能已經發生了改變。DLL的缺點就是COM的優點。

二、COM相關的結構、接口

1)、CLSID

CLSID其實就是一個號碼,或者說是一個16字節的數。觀察注冊表,在HKEY_CLASSES_ROOT\CLSID\{......}主鍵下,LocalServer32(DLL組件使用InprocServer32) 中保存著程序路徑名稱。CLSID 的結構定義如下:

typedef struct _GUID {

?????? DWORD Data1;? // 隨機數

?????? WORD Data2;?? // 和時間相關

?????? WORD Data3;?? // 和時間相關

?????? BYTE Data4[8];????? // 和網卡MAC相關

} GUID;

?

typedef GUID CLSID;? // 組件ID

typedef GUID IID;??? // 接口ID

#define REFCLSID const CLSID &

?

// 常見的聲明和賦值方法

CLSID CLSID_Excel ={0x00024500,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};

struct __declspec(uuid("00024500-0000-0000-C000-000000000046"))CLSID_Excel;

class DECLSPEC_UUID("00024500-0000-0000-C000-000000000046")CLSID_Excel;

// 注冊表中的表示方法

{00024500-0000-0000-C000-000000000046}

2)、ProgID

每一個COM組件都需要指定一個CLSID,并且不能重名。它之所以使用16個字節,就是要從概率上保證重復是“不可能”的。但是,微軟為了使用方便與記憶,也支持另一個字符串名稱方式,叫 ProgID。由于 CLSID 和 ProgID 其實是一個概念的兩個不同的表示形式,所以我們在程序中可以隨便使用任何一種。下面介紹一下 CLSID 和 ProgID 之間的轉換方法和相關的函數:

? ? ? ? ? ? ? ? ? ?

?

函數

?
?

功能說明

?
?

CLSIDFromProgID()、CLSIDFromProgIDEx()

?
?

由 ProgID 得到 CLSID。沒什么好說的,你自己都可以寫,查注冊表貝

?
?

ProgIDFromCLSID()

?
?

由 CLSID 得到 ProgID,調用者使用完成后要釋放 ProgID 的內存(注5)

?
?

CoCreateGuid()

?
?

隨機生成一個? GUID

?
?

IsEqualGUID()、IsEqualCLSID()、IsEqualIID()

?
?

比較2個ID是否相等

?
?

StringFromCLSID()、StringFromGUID2()、StringFromIID()

?
?

由 CLSID,IID 得到注冊表中CLSID樣式的字符串,注意釋放內存

?

3)、接口

3.1、函數是通過 VTAB 虛函數表提供其地址, 從另一個角度來看,不管用什么語言開發,編譯器產生的代碼都能生成這個表。這樣就實現了組件的“二進制特性”輕松實現了組件的跨語言要求。
3.2、假設有一個指針型變量保存著 VTAB 的首地址,則這個變量就叫“接口指針, 變量命名的時候,習慣上加上"I"開頭。另外為了區分不同的接口,每個接口 也都要有一個名字,該名字就和 CLSID 一樣,使用 GUID 方式,叫 IID。
3.3、接口一經發表,就不能再修改了。不然就會出現向前兼容的問題。這個性質叫“接口不變性”。
3.4、組件中必須有3個函數,QueryInterface、AddRef、Release,它們3個函數也組成一個接口,叫"IUnknown"。

3.5、任何接口,其實都包含了 IUnknown 接口。隨著你接觸到更多的接口就會了更體會解到接口的另一個性質“繼承性”。
3.6、在任何接口上,調用表中的第一個函數,其實就是調用 QueryInterface()函數,就得到你想要的另外一個接口指針。這個性質叫“接口的傳遞性”
3.7、C/C++語言中需要事先對函數聲明,那么就 會要求組件也必須提供C語言的頭文件。不行!為了能使COM具有跨語言的能力,決定不再為任何語言提供對應的函數接口聲明,而是獨立地提供一個叫類型庫(TLB)的聲明。每個語言的IDE環境自己去根據TLB生成自己語言需要的包裝。這個性質叫“接口聲明的獨立性”。

4)COM組件數據類型

HRESULT 函數返回值

????? HRESULT Add( long n1, long n2, long *pSum)

????? {

????????? *pSum = n1 + n2;

????????? return S_OK;

????? }

  如果函數正常執行,則返回 S_OK,同時真正的函數運行結果則通過參數指針返回。如果遇到了異常情況,則COM系統經過判斷,會返回相應的錯誤值。常見的返回值有:
 

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

HRESULT

?
?

?
?

含義

?
?

S_OK

?
?

0x00000000

?
?

成功

?
?

S_FALSE

?
?

0x00000001

?
?

函數成功執行完成,但返回時出現錯誤

?
?

E_INVALIDARG

?
?

0x80070057

?
?

參數有錯誤

?
?

E_OUTOFMEMORY

?
?

0x8007000E

?
?

內存申請錯誤

?
?

E_UNEXPECTED

?
?

0x8000FFFF

?
?

未知的異常

?
?

E_NOTIMPL

?
?

0x80004001

?
?

未實現功能

?
?

E_FAIL

?
?

0x80004005

?
?

沒有詳細說明的錯誤。一般需要取得? Rich Error 錯誤信息(注1)

?
?

E_POINTER

?
?

0x80004003

?
?

無效的指針

?
?

E_HANDLE

?
?

0x80070006

?
?

無效的句柄

?
?

E_ABORT

?
?

0x80004004

?
?

終止操作

?
?

E_ACCESSDENIED

?
?

0x80070005

?
?

訪問被拒絕

?
?

E_NOINTERFACE

?
?

0x80004002

?
?

不支持接口

?

?????????????????????????????

?(圖:HRESULT 的結構)
  HRESULT 其實是一個雙字節的值,其最高位(bit)如果是0表示成功,1表示錯誤。具體參見 MSDN 之"Structureof COM Error Codes"說明。我們在程序中如果需要判斷返回值,則可以使用比較運算符號;switch開關語句;也可以使用VC提供的宏:

????? HRESULT hr = 調用組件函數;

????? if( SUCCEEDED( hr ) ){...} // 如果成功

????? ......

????? if( FAILED( hr ) ){...} // 如果失敗

?

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

(圖:BSTR 內存結構)、
  BSTR 是一個指向 UNICODE 字符串的指針,且 BSTR 向前的4個字節中,使用DWORD保存著這個字符串的字節長度( 沒有含字符串的結束符)。

有關 BSTR 的處理函數:
 

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

API 函數

?
?

說明

?
?

SysAllocString()

?
?

申請一個 BSTR 指針,并初始化為一個字符串

?
?

SysFreeString()

?
?

釋放 BSTR 內存

?
?

SysAllocStringLen()

?
?

申請一個指定字符長度的? BSTR 指針,并初始化為一個字符串

?
?

SysAllocStringByteLen()

?
?

申請一個指定字節長度的? BSTR 指針,并初始化為一個字符串

?
?

SysReAllocStringLen()

?
?

重新申請 BSTR 指針

?
?

CString 函數

?
?

說明

?
?

AllocSysString()

?
?

從 CString 得到 BSTR

?
?

SetSysString()

?
?

重新申請 BSTR 指針,并復制到 CString 中

?
?

CComBSTR 函數

?

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

?
?

Append()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper() 運算符重載:!,!=,==,<,>,&,+=,+,=,BSTR

?
?

???? 太多了,但從函數名稱不能看出其基本功能。詳細資料,查看MSDN 吧。另外,左側函數,有很多是 ATL 7.0 提供的,VC6.0 下所帶的 ATL 3.0 不支持。
? ??? 由于我們將來主要用 ATL 開發組件程序,因此使用 ATL 的 CComBSTR 為主。VC也提供了其它的包裝類 _bstr_t。

?

?

各種字符串類型之間的轉換
函數 WideCharToMultiByte(),轉換 UNICODE 到MBCS。使用范例:

????? LPCOLESTR lpw = L"Hello,你好";

????? size_t wLen = wcslen( lpw ) + 1;? // 寬字符字符長度,+1表示包含字符串結束符

?????

????? int aLen=WideCharToMultiByte(? // 第一次調用,計算所需 MBCS 字符串字節長度

????????????? CP_ACP,

????????????? 0,

????????????? lpw,? // 寬字符串指針

????????????? wLen, // 字符長度

????????????? NULL,

????????????? 0,? // 參數0表示計算轉換后的字符空間

????????????? NULL,

????????????? NULL);

??????

????? LPSTR lpa = new char [aLen];

??????

????? WideCharToMultiByte(

????????????? CP_ACP,

????????????? 0,

????????????? lpw,

????????????? wLen,

????????????? lpa,? // 轉換后的字符串指針

????????????? aLen, // 給出空間大小

????????????? NULL,

????????????? NULL);

?

????? // 此時,lpa 中保存著轉換后的 MBCS 字符串

????? ... ... ... ...

????? delete [] lpa;


??? 函數 MultiByteToWideChar(),轉換MBCS 到 UNICODE。使用范例:

????? LPCSTR lpa = "Hello,你好";

????? size_t aLen = strlen( lpa ) + 1;

?????

????? int wLen = MultiByteToWideChar(

????????????? CP_ACP,

????????????? 0,

????????????? lpa,

????????????? aLen,

????????????? NULL,

????????????? 0);

?????

????? LPOLESTR lpw = new WCHAR [wLen];

????? MultiByteToWideChar(

????????????? CP_ACP,

????????????? 0,

????????????? lpa,

????????????? aLen,

????????????? lpw,

????????????? wLen);

????? ... ... ... ...

????? delete [] lpw;


?使用 ATL 提供的轉換宏。
 

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

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

?


上表中的宏函數,其實非常容易記憶:

? ? ? ? ? ? ? ? ? ?

?

2

?
?

好搞笑的縮寫,to 的發音和 2 一樣,所以借用來表示“轉換為、轉換到”的含義。

?
?

A

?
?

ANSI 字符串,也就是 MBCS。

?
?

W、OLE

?
?

寬字符串,也就是 UNICODE。

?
?

T

?
?

中間類型T。如果定義了 _UNICODE,則T表示W;如果定義了 _MBCS,則T表示A

?
?

C

?
?

const 的縮寫

?

使用范例:

#include<atlconv.h>

?void fun()

?{

???? USES_CONVERSION;? // 只需要調用一次,就可以在函數中進行多次轉換

???? LPCTSTR lp = OLE2CT( L"Hello,你好"));

???? ... ... ... ...

??? // 不用顯式釋放 lp 的內存,因為

??? // 由于 ATL 轉換宏使用棧作為臨時空間,函數結束后會自動釋放棧空間。

}

?

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

學生:我想用 VARIANT 表示一個4字節長的整數,如何做?
老師:VARIANT v;v.vt=VT_I4; v.lVal=100;

學生:我想用 VARIANT 表示布爾值“真”,如何做?
老師:VARIANT v;v.vt=VT_BOOL; v.boolVal=VARIANT_TRUE;

?

在我們寫程序的時候到比較簡單,請大家遵守幾個原則:
  1、啟動組件得到一個接口指針(Interface)后,不要調用AddRef()。因為系統知道你得到了一個指針,所以它已經幫你調用了AddRef()函數;
  2、通過QueryInterface()得到另一個接口指針后,不要調用AddRef()。因為......和上面的道理一樣;
  3、當你把接口指針賦值給(保存到)另一個變量中的時候,請調用AddRef();
  4、當不需要再使用接口指針的時候,務必執行Release()釋放;
  5、當使用智能指針的時候,可以省略指針的維護工作;

?

內存分配和釋放

??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ?

?

C語言

?
?

C++語言

?
?

Windows 平臺

?
?

COM

?
?

IMalloc 接口

?
?

BSTR

?
?

申請

?
?

malloc()

?
?

new

?
?

GlobalAlloc()

?
?

CoTaskMemAlloc()

?
?

Alloc()

?
?

SysAllocString()

?
?

重新申請

?
?

realloc()

?
?

GlobalReAlloc()

?
?

CoTaskRealloc()

?
?

Realloc()

?
?

SysReAllocString()

?
?

釋放

?
?

free()

?
?

delete

?
?

GlobalFree()

?
?

CoTaskMemFree()

?
?

Free()

?
?

SysFreeString()

?

以上這些函數必須要按類型配合使用(比如:new 申請的內存,則必須用delete 釋放)。

?

三、VC進行COM編程

VC進行COM編程,必須要掌握哪些COM理論知識。要學COM的基本原理,我推薦的書是《COM技術內幕》。但僅看這樣的書是遠遠不夠的,我們最終的目的是要學會怎么用COM去編程序,而不是拼命的研究COM本身的機制。所以我個人覺得對COM的基本原理不需要花大量的時間去追根問底,沒有必要,是吃力不討好的事。其實我們只需要掌握幾個關鍵概念就夠了。這里用VC編程所必需掌握的幾個關鍵概念。

1) COM組件實際上是一個C++類,而接口都是純虛類。組件從接口派生而來我們可以簡單的用純粹的C++的語法形式來描述COM是個什么東西:
class IObject
{
public:
virtual Function1(...) = 0;
virtual Function2(...) = 0;
....
};
class MyObject : public IObject
{
public:
virtual Function1(...){...}
virtual Function2(...){...}
....
};?
看清楚了嗎?IObject就是我們常說的接口,MyObject就是所謂的COM組件。切記接口都純虛類,它所包含的函數都是純虛函數,而且它沒有成員變量。而COM組件就是從這些純虛類繼承下來的派生類,它實現了這些虛函數,僅此而已。從上面也可以看出,COM組件是以C++為基礎的,特別重要的是虛函數和多態性的概念,COM中所有函數都是虛函數,都必須通過虛函數表VTable來調用,這一點是無比重要的,必需時刻牢記在心。
2) COM組件有三個最基本的接口類,分別是IUnknown、IClassFactory、IDispatchCOM規范規定任何組件、任何接口都必須從IUnknown繼承,IUnknown包含三個函數,分別是QueryInterface、AddRef、Release。這三個函數是無比重要的,而且它們的排列順序也是不可改變的。QueryInterface用于查詢組件實現的其它接口,說白了也就是看看這個組件的父類中還有哪些接口類,AddRef用于增加引用計數,Release用于減少引用計數。引用計數也是COM中的一個非常重要的概念。大體上簡單的說來可以這么理解,COM 組件是個DLL,當客戶程序要用它時就要把它裝到內存里。
另一方面,一個組件也不是只給你一個人用的,可能會有很多個程序同時都要用到它。但實際上DLL只裝載了一次,即內存中只有一個COM組件,那COM組件由誰來釋放?由客戶程序嗎?不可能,因為如果你釋放了組件,那別人怎么用,所以只能由COM組件自己來負責。所以出現了引用計數的概念,COM維持一個計數,記錄當前有多少人在用它,每多一次調用計數就加一,少一個客戶用它就減一,當最后一個客戶釋放它的時侯,COM知道已經沒有人用它了,它的使用已經結束了,那它就把它自己給釋放了。
引用計數是COM編程里非常容易出錯的一個地方,但所幸VC的各種各種的類庫里已經基本上把AddRef的調用給隱含了,在我的印象里,我編程的時侯還從來沒有調用過AddRef,我們只需在適當的時侯調用Release。至少有兩個時侯要記住調用Release,第一個是調用了QueryInterface以后,第二個是調用了任何得到一個接口的指針的函數以后,記住多查MSDN以確定某個函數內部是否調用了AddRef,如果是的話那調用Release的責任就要歸你了。
IUnknown的這三個函數的實現非常規范但也非常煩瑣,容易出錯,所幸的事我們可能永遠也不需要自己來實現它們。
IClassFactory的作用是創建COM組件。我們已經知道COM組件實際上就是一個類,那我們平常是怎么實例化一個類對象的?是用‘new’命令!很簡單吧,COM組件也一樣如此。但是誰來new它呢?不可能是客戶程序,因為客戶程序不可能知道組件的類名字,如果客戶知道組件的類名字那組件的可重用性就要打個大大的折扣了,事實上客戶程序只不過知道一個代表著組件的128位的數字串而已,這個等會再介紹。所以客戶無法自己創建組件,而且考慮一下,如果組件是在遠程的機器上,你還能new出一個對象嗎?所以創建組件的責任交給了一個單獨的對象,這個對象就是類廠。
每個組件都必須有一個與之相關的類廠,這個類廠知道怎么樣創建組件,當客戶請求一個組件對象的實例時,實際上這個請求交給了類廠,由類廠創建組件實例,然后把實例指針交給客戶程序。這個過程在跨進程及遠程創建組件時特別有用,因為這時就不是一個簡單的new操作就可以的了,它必須要經過調度,而這些復雜的操作都交給類廠對象去做了。
IClassFactory最重要的一個函數就是CreateInstance,顧名思議就是創建組件實例,一般情況下我們不會直接調用它,API函數都為我們封裝好它了,只有某些特殊情況下才會由我們自己來調用它,這也是VC編寫COM組件的好處,使我們有了更多的控制機會,而VB給我們這樣的機會則是太少太少了。
IDispatch叫做調度接口。它的作用何在呢?這個世上除了C++還有很多別的語言,比如VB、VJ、VBScript、JavaScript等等。可以這么說,如果這世上沒有這么多亂七八糟的語言,那就不會有IDispatch。:-) 我們知道COM組件是C++類,是靠虛函數表來調用函數的,對于VC來說毫無問題,這本來就是針對C++而設計的,以前VB不行,現在VB也可以用指針了,也可以通過VTable來調用函數了,VJ也可以,但還是有些語言不行,那就是腳本語言,典型的如VBScript、JavaScript。不行的原因在于它們并不支持指針,連指針都不能用還怎么用多態性啊,還怎么調這些虛函數啊。唉,沒辦法,也不能置這些腳本語言于不顧吧,現在網頁上用的都是這些腳本語言,而分布式應用也是COM組件的一個主要市場,它不得不被這些腳本語言所調用,既然虛函數表的方式行不通,我們只能另尋他法了。時勢造英雄,IDispatch應運而生。:-)
調度接口把每一個函數每一個屬性都編上號,客戶程序要調用這些函數屬性的時侯就把這些編號傳給IDispatch接口就行了,IDispatch再根據這些編號調用相應的函數,僅此而已。當然實際的過程遠比這復雜,當給一個編號就能讓別人知道怎么調用一個函數那不是天方夜潭嗎,你總得讓別人知道你要調用的函數要帶什么參數,參數類型什么以及返回什東西吧,而要以一種統一的方式來處理這些問題是件很頭疼的事。IDispatch接口的主要函數是Invoke,客戶程序都調用它,然后Invoke再調用相應的函數,如果看一看MS的類庫里實現Invoke的代碼就會驚嘆它實現的復雜了,因為你必須考慮各種參數類型的情況,所幸我們不需要自己來做這件事,而且可能永遠也沒這樣的機會。

IUnknown接口的三個函數就是QueryInterface,AddRef和Release。

IDispatch接口有4個函數,解釋語言的執行器就通過這僅有的4個函數來執行組件所提供的功能。IDispatch 接口用 IDL 形式說明如下:

[

??? object,

???uuid(00020400-0000-0000-C000-000000000046), // IDispatch 接口的 IID =IID_IDispatch

??? pointer_default(unique)

]

?

interface IDispatch : IUnknown

{

??? typedef [unique] IDispatch *LPDISPATCH;?? // 轉定義 IDispatch * 為 LPDISPATCH

?

??? HRESULT GetTypeInfoCount([out]UINT * pctinfo);?? // 有關類型庫的這兩個函數,咱們以后再說

??? HRESULT GetTypeInfo([in] UINTiTInfo,[in] LCID lcid,[out] ITypeInfo ** ppTInfo);

?

??? HRESULT GetIDsOfNames( // 根據函數名字,取得函數序號(DISPID)

??????????????? [in] REFIID riid,

??????????????? [in,size_is(cNames)] LPOLESTR * rgszNames,

??????????????? [in] UINT cNames,

???????????? ???[in] LCID lcid,

??????????????? [out,size_is(cNames)] DISPID * rgDispId

??????????? );

?

??? [local]???????? // 本地版函數

??? HRESULT Invoke( // 根據函數序號,解釋執行函數功能

??????????????? [in] DISPIDdispIdMember,

??????????????? [in] REFIID riid,

??????????????? [in] LCID lcid,

??????????????? [in] WORD wFlags,

??????????????? [in, out] DISPPARAMS* pDispParams,

??????????????? [out] VARIANT *pVarResult,

??????????????? [out] EXCEPINFO *pExcepInfo,

??????????????? [out] UINT *puArgErr

??????????? );

?

??? [call_as(Invoke)]????? // 遠程版函數

??? HRESULT RemoteInvoke(

??????????????? [in] DISPIDdispIdMember,

??????????????? [in] REFIID riid,

??????????????? [in] LCID lcid,

??????????????? [in] DWORD dwFlags,

??????????????? [in] DISPPARAMS *pDispParams,

??????????????? [out] VARIANT * pVarResult,

??????????????? [out] EXCEPINFO *pExcepInfo,

??????????????? [out] UINT *pArgErr,

??????????????? [in] UINT cVarRef,

??????????????? [in,size_is(cVarRef)] UINT * rgVarRefIdx,

??????????????? [in, out,size_is(cVarRef)] VARIANTARG * rgVarRef

??????????? );

}

?


3) dispinterface接口、Dual接口以及Custom接口

這是在ATL編程時用到的術語。在這里主要是想談一下自動化接口的好處及缺點,用這三個術語來解釋可能會更好一些,而且以后遲早會遇上它們,我將以一種通俗的方式來解釋它們,可能并非那么精確,就好象用偽代碼來描述算法一樣。
所謂的自動化接口就是用IDispatch實現的接口。我們已經講解過IDispatch的作用了,它的好處就是腳本語言象VBScript、JavaScript也能用COM組件了,從而基本上做到了與語言無關它的缺點主要有兩個,第一個就是速度慢效率低。這是顯而易見的,通過虛函數表一下子就可以調用函數了,而通過Invoke則等于中間轉了道手續,尤其是需要把函數參數轉換成一種規范的格式才去調用函數,耽誤了很多時間。所以一般若非是迫不得已我們都想用VTable的方式調用函數以獲得高效率。第二個缺點就是只能使用規定好的所謂的自動化數據類型。如果不用IDispatch我們可以想用什么數據類型就用什么類型,VC會自動給我們生成相應的調度代碼。而用自動化接口就不行了,因為Invoke的實現代碼是VC事先寫好的,而它不能事先預料到我們要用到的所有類型,它只能根據一些常用的數據類型來寫它的處理代碼,而且它也要考慮不同語言之間的數據類型轉換問題。所以VC自動化接口生成的調度代碼只適用于它所規定好的那些數據類型,當然這些數據類型已經足夠豐富了,但不能滿足自定義數據結構的要求。你也可以自己寫調度代碼來處理你的自定義數據結構,但這并不是一件容易的事。
考慮到IDispatch的種種缺點(現在一般都推薦寫雙接口組件,稱為dual接口,實際上就是從IDispatch繼承的接口。我們知道任何接口都必須從IUnknown繼承,IDispatch接口也不例外。那從IDispatch繼承的接口實際上就等于有兩個基類,一個是IUnknown,一個是IDispatch,所以它可以以兩種方式來調用組件,可以通過IUnknown用虛函數表的方式調用接口方法,也可以通過IDispatch::Invoke自動化調度來調用這就有了很大的靈活性,這個組件既可以用于C++的環境也可以用于腳本語言中,同時滿足了各方面的需要。
相對比的,dispinterface是一種純粹的自動化接口,可以簡單的就把它看作是IDispatch接口(雖然它實際上不是的),這種接口就只能通過自動化的方式來調用,COM組件的事件一般都用的是這種形式的接口。
Custom接口就是從IUnknown接口派生的類,顯然它就只能用虛函數表的方式來調用接口了。
4) COM組件有三種,進程內、本地、遠程。對于后兩者情況必須調度接口指針及函數參數。
COM是一個DLL,它有三種運行模式。它可以是進程內的,即和調用者在同一個進程內,也可以和調用者在同一個機器上但在不同的進程內,還可以根本就和調用者在兩臺機器上。
這里有一個根本點需要牢記,就是COM組件它只是一個DLL,它自己是運行不起來的,必須有一個進程象父親般照顧它才行,即COM組件必須在一個進程內.那誰充當看護人的責任呢?
先說說調度的問題。調度是個復雜的問題,以我的知識還講不清楚這個問題,我只是一般性的談談幾個最基本的概念。我們知道對于WIN32程序,每個進程都擁有4GB的虛擬地址空間,每個進程都有其各自的編址,同一個數據塊在不同的進程里的編址很可能就是不一樣的,所以存在著進程間的地址轉換問題。這就是調度問題。對于本地和遠程進程來說,DLL和客戶程序在不同的編址空間,所以要傳遞接口指針到客戶程序必須要經過調度。Windows經提供了現成的調度函數,就不需要我們自己來做這個復雜的事情了。對遠程組件來說函數的參數傳遞是另外一種調度。

DCOM是以RPC為基礎的,要在網絡間傳遞數據必須遵守標準的網上數據傳輸協議,數據傳遞前要先打包,傳遞到目的地后要解包,這個過程就是調度,這個過程很復雜,不過Windows已經把一切都給我們做好了,一般情況下我們不需要自己來編寫調度DLL。
我們剛說過一個COM組件必須在一個進程內。對于本地模式的組件一般是以EXE的形式出現,所以它本身就已經是一個進程。對于遠程DLL,我們必須找一個進程,這個進程必須包含了調度代碼以實現基本的調度。這個進程就是dllhost.exe。這是COM默認的DLL代理。實際上在分布式應用中,我們應該用MTS來作為DLL代理,因為MTS有著很強大的功能,是專門的用于管理分布式DLL組件的工具。
調度離我們很近又似乎很遠,我們編程時很少關注到它,這也是COM的一個優點之一,既平臺無關性,無論你是遠程的、本地的還是進程內的,編程是一樣的,一切細節都由COM自己處理好了,所以我們也不用深究這個問題,只要有個概念就可以了,當然如果你對調度有自己特殊的要求就需要深入了解調度的整個過程了,這里推薦一本《COM+技術內幕》,這絕對是一本講調度的好書。
5) COM組件的核心是IDL。
我們希望軟件是一塊塊拼裝出來的,但不可能是沒有規定的胡亂拼接,總是要遵守一定的標準,各個模塊之間如何才能親密無間的合作,必須要事先共同制訂好它們之間交互的規范,這個規范就是接口。我們知道接口實際上都是純虛類,它里面定義好了很多的純虛函數,等著某個組件去實現它,這個接口就是兩個完全不相關的模塊能夠組合在一起的關鍵試想一下如果我們是一個應用軟件廠商,我們的軟件中需要用到某個模塊,我們沒有時間自己開發,所以我們想到市場上找一找看有沒有這樣的模塊,我們怎么去找呢?也許我們需要的這個模塊在業界已經有了標準,已經有人制訂好了標準的接口,有很多組件工具廠商已經在自己的組件中實現了這個接口,那我們尋找的目標就是這些已經實現了接口的組件,我們不關心組件從哪來,它有什么其它的功能,我們只關心它是否很好的實現了我們制訂好的接口。這種接口可能是業界的標準,也可能只是你和幾個廠商之間內部制訂的協議,但總之它是一個標準,是你的軟件和別人的模塊能夠組合在一起的基礎,是COM組件通信的標準。
COM具有語言無關性,它可以用任何語言編寫,也可以在任何語言平臺上被調用。但至今為止我們一直是以C++的環境中談COM,那它的語言無關性是怎么體現出來的呢?或者換句話說,我們怎樣才能以語言無關的方式來定義接口呢?前面我們是直接用純虛類的方式定義的,但顯然是不行的,除了C++誰還認它呢?正是出于這種考慮,微軟決定采用IDL來定義接口。說白了,IDL實際上就是一種大家都認識的語言,用它來定義接口,不論放到哪個語言平臺上都認識它。我們可以想象一下理想的標準的組件模式,我們總是從IDL開始,先用IDL制訂好各個接口,然后把實現接口的任務分配不同的人,有的人可能善長用VC,有的人可能善長用VB,這沒關系,作為項目負責人我不關心這些,我只關心你最后把DLL拿給我。這是一種多么好的開發模式,可以用任何語言來開發,也可以用任何語言也欣賞你的開發成果。
6) COM組件的運行機制,即COM是怎么跑起來的。
這部分我們將構造一個創建COM組件的最小框架結構,然后看一看其內部處理流程是怎樣的。

IUnknown *pUnk=NULL;
IObject *pObject=NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown,
(void**)&pUnk);
pUnk->QueryInterface(IID_IOjbect, (void**)&pObject);
pUnk->Release();
pObject->Func();
pObject->Release();
CoUninitialize();
CoCreateInstance身上,讓我們來看看它內部做了一些什么事情。以下是它內部實現的一個偽代碼:
CoCreateInstance(....)
{
.......
IClassFactory *pClassFactory=NULL;
CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory,(void**)&pClassFactory);
pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
pClassFactory->Release();
........
}

這段話的意思就是先得到類廠對象,再通過類廠創建組件從而得到IUnknown指針。
繼續深入一步,看看CoGetClassObject的內部偽碼:
CoGetClassObject(.....)
{
//通過查注冊表CLSID_Object,得知組件DLL的位置、文件名
//裝入DLL庫
//使用函數GetProcAddress(...)得到DLL庫中函數DllGetClassObject的函數指針。
//調用DllGetClassObject
}?
DllGetClassObject是干什么的,它是用來獲得類廠對象的。只有先得到類廠才能去創建組件.
下面是DllGetClassObject的偽碼:
DllGetClassObject(...)
{
......
CFactory* pFactory= new CFactory; //類廠對象
pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory);
//查詢IClassFactory指針
pFactory->Release();
......
}
CoGetClassObject的流程已經到此為止,現在返回CoCreateInstance,看看CreateInstance的偽碼:
CFactory::CreateInstance(.....)
{
...........
CObject *pObject = new CObject; //組件對象
pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
pObject->Release();
...........
}?
上面是從COM+技術內幕中COPY來的一個例圖,從圖中可以清楚的看到CoCreateInstance的整個流程。

7) 一個典型的自注冊的COMDLL所必有的四個函數
DllGetClassObject:用于獲得類廠指針
DllRegisterServer:注冊一些必要的信息到注冊表中
DllUnregisterServer:卸載注冊信息
DllCanUnloadNow:系統空閑時會調用這個函數,以確定是否可以卸載DLL
DLL還有一個函數是DllMain,這個函數在COM中并不要求一定要實現它,但是在VC生成的組件中自動都包含了它,它的作用主要是得到一個全局的實例對象。
8) 注冊表在COM中的重要作用
首先要知道GUID的概念,COM中所有的類、接口、類型庫都用GUID來唯一標識,GUID是一個128位的字串,根據特制算法生成的GUID可以保證是全世界唯一的。
COM組件的創建,查詢接口都是通過注冊表進行的。有了注冊表,應用程序就不需要知道組件的DLL文件名、位置,只需要根據CLSID查就可以了。當版本升級的時侯,只要改一下注冊表信息就可以神不知鬼不覺的轉到新版本的DLL。

9)事件和通知

在實際開發中,COM 組件用線程方式下載網絡上的一個文件,當我完成任務后,需要通知調用者。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

通知方式

?
?

簡單說明

?
?

直接消息

?
?

PostMessage()
? PostThreadMessage()

?
?

向窗口或線程發個消息

?
?

SendMessage()

?
?

馬上執行消息響應函數

?
?

SendMessage(WM_COPYDATA...)

?
?

發消息的同時,還可以帶過去一些自定義的數據

?
?

間接消息

?
?

InvalidateRect()
? SetTimer()
? ......

?
?

被調用的函數會發送相關的一些消息

?
?

回調函數

?
?

GetOpenFileName()......

?
?

當用戶改變文件選擇的時候,執行回調函數

?

 回調函數的方式,是設計 COM 通知方法的基礎。回調函數,本質上是預先把某一函數的指針告訴我,當我有必要的時候,就直接呼叫該函數了,而這個回調函數做了什么,怎么做的,我是根本不關心的。好了,問你個問題:啥是 COM 的接口?接口其實就是一組相關函數的集合(這個定義不嚴謹,但你可以這么理解哈)。因此,在COM中不使用“回調函數”而是使用“回調接口”(說的再清楚一些,就是使用一大堆包裝好的“回調函數”集) ,回調接口,我們也叫“接收器接口”。


(圖:客戶端傳遞接收器接口指針給COM。當發生事件時,COM調用接收器接口函數完成通知)

連接點,通過連接點可以實現事件的回調。


(圖:連接點組件原理圖。左側為客戶端,右側為服務端(組件對象))
1、一個 COM 組件,允許有多個連接點對象(IConnectionPoint)。也就是說可以有多個發生“事件”的源頭。上圖就有3個連接點;
2、管理這些連接點的接口叫“連接點容器”(IConnectionPointContainer)。連接點容器接口特別簡單,因為只有2個函數,一個是 FindConnectionPoint(),表示查找你想要的連接點;另一個是 EnumConnectionPoints(),表示列出所有的連接點,然后你去選擇使用哪個。在實際的應用中,查找法使用最多,占90%,而枚舉法使用只占 10%,一般在支持第三方的插件(Plug in)時才使用。

3、每一個連接點,可以被多個客戶端的接收器(Sink)連接

10)代理和存根

COM兩個組件之間不是直接通信,而是通過代理和存根來之間的通信來間接實現的。圖中的channel是com庫的一部分。 COM里,只有進程外組件才會用到代理(proxy)和存根(stub)。 代理在客戶的進程內創建,存根在組件com對象的進程中創建。 每個接口的每個函數都有自己的代理和存根。

為什么要用代理和存根 ?

客 戶為什么要用代理和存根,而不直接同對象連接呢?給你一個理由,對客戶來說,他與所有com對象的連接都是通過指針來調用的, 而對服務來說,調用對象的接口函數也是通過指針來完成的,然而,指針只有在同一進程內才會有效。這樣,代理和存根為了完成這個使命也就產生了。

代理和存根的作用不只這些,他還要打包所有的參數(包括接口指針),產生 RPC(遠程進程調用),通向另一個進程,或者對象運行所在的另一臺機器。

圖: 代理的結構

上圖所顯示的代理結構支持參數的標準列集。每個接口的代理實現了IRpcProxyBuffer接口,用于內聚各個部分之間的相互通信。當代理準備把已列集的參數傳遞過進程邊界時,他調用IRpcChannelBuffer?接口的方法(該接口由channel實現)。channel調用RPC運行庫使數據傳輸到目的地。

圖: 存根的結構

如上圖所示,每個接口的存根被連接到對象的相應接口上。chnnel分發傳入的消息到適當的接口的存根。所有的組件通過IRpcChannelBuffer接口與chnnel交流,這個接口提供了與RPC運行庫的連接。

列集(marshalling)

說到代理和存根,自然少不了列集,什么是列集?

列集,對函數參數進行打包處理得過程,因為指針等數據,必須通過一定得轉換,才能被另一組件所理解,列集完成后,RPC調用就會產生。可以說列集是一種數據格式的轉換方法。

列集有3種方式:

1. 類型庫列集

它可以列集與OLEAUTOMATION兼容的任何接口,意思是你的接口的返回值必須是HRESULT,所使用的參數的類型也應該是與C++的VARIANT結構兼容。

2. 通過創建Stub / proxy DLL

這個DLL的源代由MIDL產生。你必須在服務器和客戶機上都注冊這個DLL(這是標準的marshal 方式)使用吃方法時,最好把stub / proxy代碼編譯作為一個獨立的組件。

3. 自定義marshaling

自定義marshal要求在你的組件中必須實現IMarshal接口。當COM需要marchal時,他首先通過QueryInterface看你是否支 持IMarshal接口,如果你實現了該接口,也就是說,由你控制了你的COM的所有參數和返回值的打包、解包的方法模式。

代理和存根dll的建立

使用工具MIDL,對一個IDL文件,MIDL會分析自動產生相應的代理/存根 DLL的相關文件。

怎么使用代理和存根

COM組件對外輸出接口有兩種模式:TLB庫((TypeLibrary)模式和代理/存根(Proxy/stud)模式。如果COM組件是通過TLB庫模式輸出的時候,將會生成一個.tlb文件,這種方法客戶端調用也方便(直接導入即可),同時支持跨語言開發和調用,所以是VC默認的COM接口輸出模式。但是該模式將不支持部分IDL語言定義的接口屬性,例如:size_is,length_is,[]ref等相關屬性。關于tlb的說明請參考http://msdn.microsoft.com/en-us/library/aa366757(v=vs.85).aspx文檔。代理/存根(Proxy/stud)模式相對就比較麻煩,并且不能支持跨語言開發和調用,但是可以很好的支持IDL語言定義的各種屬性。下面我們主要說明一下代理/存根(Proxy/stud)模式的生產和組件調用。關于IDL接口的定義和說明請參考http://msdn.microsoft.com/en-us/library/aa367091(v=VS.85).aspx文檔。

代理/存根(Proxy/stud)模式下COM組件或者服務的生成:由于VC編譯器默認生成的是tlb庫模式,所以首先需要通過/notlb編譯選項告訴編譯器我們不需要tlb庫輸出,同時需要在資源文件(.rc)中將導入tlb庫的命令取消(TYPELIB "Interface.tlb")。如果為services服務,在執行前面步驟操作后需要編寫一個.mk文件。該文件主要用來將idl接口文件生產的.h, _i.c, _p.c,dlldata.c編譯生產代理/存根(Proxy/stud)需要的dll文件, 并通過nmake-f DataExchangeServer.mk 命令編譯和生產dll文件,最后通過regsvr32命令將dll注冊為服務。
10)COM使用線程

單線程單元(STA)、多線程單元(MTA)

單線程單元:只允許一個線程訪問組件,但是在一個進程中允許有多個單線程單元。

多線程單元:多個線程可以同時訪問組件。

11)錯誤處理

在舊COM技術中,錯誤是通過方法返回HRESULT值來定義的。HRESULT的值是S_OK,表示方法成功。

新COM組件就實現接口ISupportErrorInfo,該接口不但提供了錯誤信息,還提供了幫助文件的鏈接、錯誤源,在方法返回時還會返回一個錯誤信息對象。

?

四、VC調用COM的方式

原文出處:http://topic.csdn.net/t/20040417/16/2977524.html,此篇轉載稍有修改。

準備及條件: ??
? COM服務器為進程內服務器,DLL名為simpCOM.dll,該組件只有一個接口IFoo,該接口只有一個方法HRESULT ? SayHello(void)???
????
? 在SDK中調用 ??
? ===================================== ??
? 1、最簡單最常用的一種,用#import導入類型庫,利用VC提供的智能指針包裝類 ??
? 演示代碼:???
? #import ? "D:/Temp/vc/simpCOM/Debug/simpCOM.dll" ?no_namespace ??
? CoInitialize(NULL);???
? IFooPtr ? spFoo ? = ? NULL; ??
? spFoo.CreateInstance(__uuidof(Foo)); ??
? spFoo->SayHello(); ??
? spFoo.Release();/*暈死了,本來智能指針就是為了讓用戶不用關心這個的,可是我發現如果不手工調用一下的話,程序退出后會發生內存訪問錯誤,我是在console中做試驗的,哪位大俠知道怎么回事請一定指教*/ ?
? CoUninitialize();???
/*lynn注:確實是IXXXPtr智能指針所引起的問題,正確的方式有:
1).限制智能指針作用域:
CoInitialize(NULL);???
{
? IFooPtr ? spFoo ? = ? NULL;?//這樣寫也沒問題,IFooPtr應該重載了賦值操作,但是IFooPtr是個類,不要把它當成真的原始指針了
? spFoo.CreateInstance(__uuidof(Foo)); ??
? spFoo->SayHello(); ??
?// spFoo.Release();
}
??CoUninitialize();
2).跟原句差不多:
? CoInitialize(NULL);???
? IFooPtr ? spFoo ? = ? NULL; ??
? spFoo.CreateInstance(__uuidof(Foo)); ??
? spFoo->SayHello(); ??
//? spFoo.Release();?
? spFoo??= NULL;? // 網上找的,所以可以肯定IFooPtr定義了賦值操作
? CoUninitialize();???
*/
????
????
? 2、引入midl.exe產生的*.h,*_i.c文件,利用CoCreateInstance函數來調用???
? 演示代碼: ??
? /*在工程中加入*_i.c文件,例如本例的simpCOM_i.c,該文件定義了類和接口的guid值,如果不引入的話,會發生連接錯誤。*/???
? #include ? "D:/Temp/vc/simpCOM/simpCOM.h" ??
? CoInitialize(NULL);???
? IFoo* ? pFoo ? = ? NULL; ??
? HRESULT ? hr ? = ? CoCreateInstance(CLSID_Foo, ?NULL, ? CLSCTX_ALL, ? IID_IFoo, ? (void**)&pFoo); ?
? if ? (SUCCEEDED(hr) ? && ? (pFoo ? != ?NULL)) ??
? { ??
? pFoo->SayHello(); ??
? pFoo->Release(); ??
? }???
? CoUninitialize();???
/*
lynn注: 二適合有COM組件源碼的情況,比如自己編寫的COM組件,在VS項目里的“生成的文件”里的那兩個文件
*/
????
?3、不用CoCreateInstance,直接用CoGetClassObejct得到類廠對象接口,然后用該接口的方法CreateInstance來生成實例。 ?
? 演示代碼: ??
? /*前期準備如二方法所述*/ ??
? IClassFactory* ? pcf ? = ? NULL; ??
? HRESULT hr ? = ? CoGetClassObject(CLSID_Foo, ?CLSCTX_ALL, ? NULL, ? IID_IClassFactory, ? (void**)&pcf);?
? if ? (SUCCEEDED(hr) ? && ? (pcf ? != ?NULL)) ??
? { ??
? IFoo* ? pFoo ? = ? NULL; ??
? hr ? = ? pcf->CreateInstance(NULL, ? IID_IFoo, ?(void**)&pFoo); ??
? if ? (SUCCEEDED(hr) ? ? && ? (pFoo ? !=? NULL)) ??
? { ??
? pFoo->SayHello(); ??
? pFoo->Release(); ??
? } ??
? pcf->Release(); ??
? }???

????
? 4、不用CoCreateInstance ? or ? CoGetClassObject,直接從dll中得到DllGetClassObject,接著生成類對象及類實例(本方法適合于你想用某個組件,卻不想在注冊表中注冊該組件)???
? 演示代碼: ??
? /*前期準備工作如二方法所述,事實上只要得到CLSID和IID的定義及接口的定義就行*/???
? typedef ? HRESULT ? (__stdcall ? * ? pfnGCO) ?(REFCLSID, ? REFIID, ? void**); ?
? pfnGCO ? fnGCO ? = ? NULL; ??
? HINSTANCE ? hdllInst ? = ? LoadLibrary("D://Temp//vc//simpCOM//Debug//simpCOM.dll");?
? fnGCO ? = ? (pfnGCO)GetProcAddress(hdllInst, ?"DllGetClassObject"); ??
? if ? (fnGCO ? != ? 0) ??
? { ??
? IClassFactory* ? pcf ? = ? NULL; ??
? HRESULT ? hr=(fnGCO)(CLSID_Foo, ? IID_IClassFactory, ?(void**)&pcf); ??
? if ? (SUCCEEDED(hr) ? && ? (pcf ? != ?NULL)) ??
? { ??
? IFoo* ? pFoo ? = ? NULL; ??
? hr ? = ? pcf->CreateInstance(NULL, ? IID_IFoo, ?(void**)&pFoo); ??
? if ? (SUCCEEDED(hr) ? ? && ? (pFoo ? !=? NULL)) ??
? { ??
? pFoo->SayHello(); ??
? pFoo->Release(); ??
? } ??
? pcf->Release(); ??
? } ??
? } ??
? FreeLibrary(hdllInst);???
? 在MFC中調用 ??
? ===================================== ??
? 在MFC中除了上面的幾種方法外,還有一種更方便的方法,就是通過ClassWizard利用類型庫生成包裝類,不過有個前提就是com組件的接口必須是派生自IDispatch ?
? ??
? 具體方法: ??
? 1、按Ctrl+W調出類向導,按Add ? Class按鈕彈出新菜單,選From ? a ? type? libarary,然后定位到simpCOM.dll,接下來會出來該simpCOM中的所有接口,選擇你想生成的接口包裝類后,向導會自動生成相應的.cpp和.h文件. ?
? 這樣你就可以在你的MFC工程中像使用普通類那樣使用COM組件了.???
? 演示代碼:???
? CoInitialize(NULL);???
? IFoo ? foo; ??
? if ? (foo.CreateDispatch("simpCOM.Foo") ? != ?0) ??
? { ??
? foo.SayHello(); ??
? foo.ReleaseDispatch(); ??
? }???
? CoUninitialize();

?

五、COM使用的注意細節

1.ConvertStringToBSTR 也是需要釋放內存空間的
Example?
// ConvertStringToBSTR.cpp?
#include <comutil.h>?
#include <stdio.h>?
#pragma comment(lib, "comsupp.lib")?
#pragma comment(lib, "kernel32.lib")?
int main()?
{?
char* lpszText = "Test";?
printf("char * text: %s/n", lpszText);?
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);?
wprintf(L"BSTR text: %s/n", bstrText);?
SysFreeString(bstrText);?
}?
或者:
??? char*?? pTemp;
??? CString csTemp;

??? pTemp =_com_util::ConvertBSTRToString(bsVal);
??? csTemp = pTemp;
??? delete pTemp;
??? pTemp = NULL;

2.對于throw()的函數,為了統一處理com錯誤,可以這樣
?inline?? void?? TESTHR(HRESULT??x)?? {if?? FAILED(x)?? _com_issue_error(x);};??
? ...???
? try???
? {???
? TESTHR(pConnection.CreateInstance(__uuidof(Connection)));?? //智能指針的CreateInstance是不拋異常的(根據HRESULTE判斷調用是否成功),這里加了個宏就使異常處理統一了
? pConnection->Open(strCnn,?? "",??"",?? adConnectUnspecified);???
? pConnection->Open(strCnn,?? "",??"",?? adConnectUnspecified);???
? }???
? catch(_com_error?? &e)???
? {???
? CString?? t;???
? t.Format("%s",?? e.ErrorMessage());???
? AfxMessageBox(t);???
? }

3、在stdafx.h文件導入dll能夠讓編譯器在運行時連接dll的類型庫,#import它能夠自動產生一個對GUIDs的定義,同時自動生成對clsado對象的封裝。同時能夠列舉它在類中所能找到的類型, ? VC++會在編譯的時候自動生成兩個文件:???
? 一個頭文件(.tlh),它包含了列舉的類型和對類型庫中對象的定義;???
? 一個實現文件(.tli)對類型庫對象模型中的方法產生封裝。???
? Namespace(名字空間)用來定義一個名字空間,使用unsing就可以將當前的類型上下文轉換名字空間所定地,讓我們可以訪問服務組件的方法。???
? 如果我們修改了服務組件程序,建議刪除這兩個文件后重新完整編譯工程,以便讓編譯器重新列舉類的屬性以及函數。??

4、COM接口類型

COM接口定義時可分為直接繼承IUnkown接口(vtable結構)、直接聲明為dispinterface和由IDispatch繼承三種形式,一般來說分別稱之為純接口、分發接口和雙接口
純接口只有C/C++語言可以聲明,理所當然是.h頭文件的形式,也只有C/C++語言可以感知,但是通常并不使用C/C++直接書寫.h頭文件,而是使用midl命令對idl文件(接口定義文件)生成C/C++同時兼容的.h頭文件。
VB和腳本語言只能識別分發接口的結構,這些語言的運行時庫或虛擬機可以生成和識別.tlb文件,而.tlb文件也可以通過使用midl命令編譯idl文件生成。?
可以看出.h頭文件和.tlb類型庫文件實際上是起到相同的作用,即定義和感知接口的二進制結構,只不過一個是使用文本形式,一個是使用字節碼形式。?
需要說明的是C/C++語言是可以感知分發接口的結構的,因為它的編譯器可以解析.tlb類型庫文件,方法是:#import"xxx.tlb" no_namespace,這就是說VB和腳本語言實現的COM組件可以被C/C++語言環境使用,而C/C++語言定義的接口(.h頭文件中定義)不能被VB和腳本語言感知,為了解決這個問題雙接口應運而生,雙接口的結構實際上就是純接口+分發接口。在使用C/C++語言開發COM組件時,使用雙接口定義就可以被VB和腳本語言使用了,當然雙接口的接口函數的參數必須服從和分發接口情況下一樣的限制,即必須是OLE變量兼容類型(Variant兼容類型)。

?

5、COM線程模型

COM提供的線程模型共有三種:Single-ThreadedApartment(STA 單線程套間)、MultithreadedApartment(MTA 多線程套間)和NeutralApartment/Thread Neutral Apartment/Neutral Threaded Apartment(NA/TNA/NTA中立線程套間,由COM+提供)。雖然它們的名字都含有套間這個詞,這只是COM運行時期庫(注意,不是COM規范,以下簡稱COM)使用套間技術來實現前面的三種線程模型,應注意套間和線程模型不是同一個概念。COM提供的套間共有三種,分別一一對應。而線程模型的存在就是線程規則的不同導致的,而所謂的線程規則就只有兩個:代碼是線程安全的或不安全的,即代碼訪問公共數據時會或不會發生訪問沖突。由于線程模型只是個模型,概念上的,因此可以違背它,不過就不能獲得COM提供的自動同步調用及兼容等好處了。
  STA 一個對象只能由一個線程訪問(通過對象的接口指針調用其方法),其他線程不得訪問這個對象,因此對于這個對象的所有調用都是同步了的,對象的狀態(也就是對象的成員變量的值)肯定是正確變化的,不會出現線程訪問沖突而導致對象狀態錯誤。其他線程要訪問這個對象,必須等待,直到那個唯一的線程空閑時才能調用對象。注意:這只是要求、希望、協議,實際是否做到是由COM決定的。如上所說,這個模型很像Windows提供的窗口消息運行機制,因此這個線程模型非常適合于擁有界面的組件,像ActiveX控件、OLE文檔服務器等,都應該使用STA的套間。
  MTA 一個對象可以被多個線程訪問,即這個對象的代碼在自己的方法中實現了線程保護,保證可以正確改變自己的狀態。這對于作為業務邏輯組件或干后臺服務的組件非常適合。因為作為一個分布式的服務器,同一時間可能有幾千條服務請求到達,如果排隊進行調用,那么將是不能想像的。注意:這也只是一個要求、希望、協議而已。
  NA 一個對象可以被任何線程訪問,與MTA不同的是任何線程,而且當跨套間訪問時(后面說明),它的調用費用(耗費的CPU時間及資源)要少得多。這準確的說都已經不能算是線程模型了,它是結合套間的具體實現而提出的要求,它和MTA不同的是COM的實現方式而已。

STA套件的初始化方式(兩種方式等效):

1,CoInitialize(nil);

2,CoInitializeEx(nil,COINIT_APARTMENTTHREADED);

MTA套間的初始化方式:

1,CoInitializeEx(nil,COINIT_MULTITHREADED);

?

編寫可以工作的COM客戶端

要編寫可以工作的COM客戶端,需要遵循三條規則。牢記這些規則,你就可以在編寫COM客戶端時避免嚴重的錯誤。

規則1:客戶線程必須調用CoInitialize[Ex]

線程做任何與COM相關的操作之前,必須調用CoInitialize或者CoInitializeEx初始化COM。如果客戶程序有20個線程,其中10個使用COM,則這10個線程都應該調用CoInitialize或者CoInitializeEx。調用線程將在這兩個API中被分配給一個套間。對于沒有分配給套間的線程,COM是無法施行并發規則的。此外還要記住,成功調用了CoInitialize或者CoInitializeEx的線程應該在終止前調用CoUninitialize。否則,由CoInitialize[Ex]分配的資源將直到進程終止才釋放。

這條規則看起來很簡單,只是一個函數調用而已。但是你會驚奇地發現,這條規則經常被違背。違背這條規則的錯誤一般在調用CoCreateInstance或者其他COM API時展現。但是有時候問題直到很晚才出現,而且客戶端的錯誤似乎與沒有初始化COM沒有明顯的關系。

具有諷刺意味的是,有時候開發者不調用CoInitialize[Ex]的原因是,微軟告訴他們不需要調用。MSDN中有篇文章說COM客戶端有時候可以避免調用這個函數。但文章隨后說這可能會導致拒絕訪問。我近期收到一個開發者的電話,說客戶線程調用Release的時候會死鎖或者發生拒絕訪問異常。原因是?有些線程沒有調用CoInitialize[Ex]就發起方法調用了,結果調用Release的時候發生問題了。幸運地是,解決問題只需要簡單地加幾個CoInitialize[Ex]調用。

記住:調用CoInitialize[Ex]總是沒有壞處的。對于調用COM API或者以任何方式使用COM對象的線程,調用CoInitialize[Ex]應該說是必須的。

規則2:STA線程需要消息循環

如果不理解單線程套間機制,這條規則看起來不那么明顯。客戶調用基于STA的對象時,調用將被傳遞到STA中運行的線程。COM通過向STA的隱藏窗口投遞消息來完成這種傳遞。那么,如果STA中的線程不接收和分發消息將發生什么?調用將在RPC通道中消失,永遠也不返回。它將永遠凋謝在STA的消息隊列中(It will languish in the STA's messagequeue forever)。

開發者問我為什么方法調用不返回的時候,我首先問他們“你調用的對象是在STA中嗎?如果是,驅動STA的線程是否有消息循環?”。多半的回答是“我不知道”。如果你不知道,你就是在玩火。調用CoInitialize,或者使用參數COINIT_APARTMENTTHREADED調用CoInitializeEx,或者調用MFC的AfxOleInit的時候,線程被分配到一個STA中。如果隨后在這個STA中創建對象,而STA線程又沒有消息泵,那么對象不能接收來自其他套間的客戶的方法調用。消息泵可以這樣簡單:

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
????? DispatchMessage (&msg)
}

如果缺少這些簡單的語句,把線程放入STA時要當心。一個常見的情況是MFC應用程序啟動工作線程(MFC工作線程的定義是,缺少消息泵的線程),而線程調用AfxOleInit將自身放入到STA中。如果STA不容納任何對象,或者雖然容納對象但是卻沒有來自其他套間的客戶,你不會遇到問題。但是如果STA容納導出接口指針到其他套間的對象,則對這些接口指針的調用將永遠不會返回。

規則3:不要在套間之間傳遞原始未列集的接口指針

設想編寫一個有兩個線程的COM客戶端。兩個線程都調用CoInitialize進入一個STA,然后其中一個線程——線程A,使用CoCreateInstance創建一個COM對象。線程A想要與線程B共享從CoCreateInstance返回的接口指針。所以線程A將接口指針賦值給一個全局變量,然后通知線程B指針已經準備好了。線程B從全局變量讀取接口指針并且對對象發起調用。這個過程有什么錯誤嗎?

這個過程會引發事故。問題是線程A向其他套間中的線程傳遞了原始未列集的接口指針。線程B應該只通過列集到線程B所屬套間的接口指針與對象通信。

這里“列集(Marshaling)”的意思是給COM在線程B所屬套間中創建新代理的機會,讓線程B可以安全地進行調用。在套間之間傳遞原始接口指針的后果可以從與時間極其相關(也很難重現)的數據損壞到完全死鎖。

如果線程A列集接口指針,則可以安全地與線程B共享接口指針。COM客戶端有兩種基本的方法將接口指針列集到其他套間:

使用COM API函數CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream。

線程A調用CoMarshalInterThreadInterfaceInStream列集接口指針,線程B調用CoGetInterfaceAndReleaseStream進行散集。通過函數CoGetInterfaceAndReleaseStream,COM在調用者套間中創建新的代理。如果接口指針不需要進行列集(比如說,兩個線程共享同一個套間時),CoGetInterfaceAndReleaseStream會智能地不創建代理。

使用在Windows NT4.0 Service Pack 3中首次引入的全局接口表(Global Interface Table,GIT)。

GIT是每個進程一個的表格,讓各個線程可以安全地共享接口指針。如果線程A想要與同一個進程中的其他線程共享接口指針,可以使用IGlobalInterfaceTable::RegisterInterfaceInGlobal來將接口指針放到GIT中。然后想要使用接口的線程可以調用IGlobalInterfaceTable::GetInterfaceFromGlobal來獲取接口指針。神奇之處在于線程從GIT獲取接口指針的時候,COM會將接口指針列集到獲取線程所屬的套間中。

有沒有不列集需要與其他線程共享的接口指針也OK的情況?有。如果兩個線程屬于同一個套間,則可以共享原始未列集的接口指針,而這只可能在兩個線程都屬于MTA時發生。如果不確定是否需要,請進行列集。調用CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream或者使用GIT總是無害的,因為COM只在必要的時候才進行列集。

編寫可以工作的COM服務器

編寫COM服務器時也應該遵守一些規則。

規則1:保護ThreadingModel=Apartment的對象的共享數據

標記對象的ThreadingModel=Apartment就可以不考慮線程安全問題?這是關于COM編程的一個最常見的錯誤想法。注冊進程內對象的ThreadingModel=Apartment暗示COM,對象(以及從DLL創建的其他對象)會以線程安全的方式訪問共享數據。這意味著已經使用臨界區或者其他線程同步原語來保證在任何時刻只有一個線程可以接觸到共享數據。對象之間數據共享通常有三種方式:

DLL中聲明全局變量

C++類中的靜態成員變量

靜態局部變量

為什么線程同步對于ThreadingModel=Apartment的對象是很重要的?考慮從同一個DLL創建兩個對象A和B的情況。假定兩個對象都讀寫在DLL中聲明的一個全局變量。因為標記為ThreadingModel=Apartment,對象可能分別在不同的STA中創建和運行,因此,也是在不同的線程中運行。但是兩個對象訪問的全局變量是共享的,只在進程內實例化一次。如果來自A和B的調用幾乎同時發生,而且A寫入那個變量,B讀取那個變量(或者相反),那么變量可能被破壞,除非串行化線程的操作。如果不提供同步機制,那么多數時候會遇到問題。最終兩個線程可能在共享數據上發生沖突,后果無法預知。

存在不需要同步機制就可以安全地訪問共享數據的情況嗎?存在。下列條件下可以不需要同步機制:

沒有為對象注冊ThreadingModel值(也稱作ThreadingModel=None或者ThreadingModel=Single)時,所有對象在相同STA(主STA)和相同線程中運行,因此不會在共享數據上發生沖突。

雖然標記為ThreadingModel=Apartment,但是確信對象將在相同的STA中運行(比如說,所有對象都由同一個STA線程創建)。

確信對象不會被并發地調用時。

對于除此之外的情況,要確保ThreadingModel=Apartment的對象以線程安全的方式訪問共享數據,只有這樣才是正確完成了任務。

規則2:標記為ThreadingModel=Free或者ThreadingModel=Both的對象應該是線程安全的。

標記對象是ThreadingModel=Free或者ThreadingModel=Both時,對象將被或者可能被放入到MTA中。記住:COM不會串行化對基于MTA的對象的調用。因此,毫無疑問地(beyond the shadow of a doubt),除非確信對象的客戶不會進行并發調用,對象應該是完全線程安全的。這意味著除了要同步由多個實例共享的數據之外,還必須同步對非靜態成員變量的訪問。編寫線程安全的代碼不容易,但是如果準備使用MTA,就必須這么做。

規則3:避免在標記為ThreadingModel=Free或者ThreadingModel=Both的對象里使用線程局部存儲(TLS)

一些Windows程序員使用線程局部存儲臨時保存數據。設想在實現一個COM方法時,需要緩存一些關于當前調用的信息,以備下次調用時使用。這時你可能很想使用TLS。在STA中,這樣做沒問題。但是如果對象在MTA中,就應該像躲避瘟疫那樣避免使用TLS。

為什么?因為進入MTA的調用被傳遞給RPC線程。每次調用可能被傳遞給不同的RPC線程,即使調用都是來自于同一個線程中的同一個調用者。一個線程不能訪問另一個線程的線程局部存儲。所以如果調用1到達線程A,對象將數據保存在TLS中;然后調用2到達線程B,對象試圖取出在調用1中存入TLS的數據時,會找不到數據。這個道理很簡單。

對于基于MTA的對象,在方法調用之間使用TLS緩存數據時要注意,這種方法只在所有的方法調用來自于對象所在的MTA中的同一個線程時才可以正確工作。

?

參考資料:

《COM技術內幕》

COM 組件設計與應用

http://www.vckbase.com/document/viewdoc/?id=1483

vc中調用Com組件方法

http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html

理解COM套間:

http://www.cnblogs.com/Quincy/archive/2011/03/03/1969510.html

轉載于:https://www.cnblogs.com/zhehan54/p/4628730.html

總結

以上是生活随笔為你收集整理的【转载】COM小结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品国产国产综合精品 | 性生交大片免费看女人按摩摩 | 国产极品美女高潮无套在线观看 | 色老头在线一区二区三区 | 亚洲综合伊人久久大杳蕉 | 国产女主播喷水视频在线观看 | 亚洲男女内射在线播放 | 欧洲精品码一区二区三区免费看 | 久久国产自偷自偷免费一区调 | 老熟女重囗味hdxx69 | 少妇人妻偷人精品无码视频 | 国内综合精品午夜久久资源 | 欧洲熟妇精品视频 | 精品欧美一区二区三区久久久 | 97久久超碰中文字幕 | 国产又粗又硬又大爽黄老大爷视 | 亚洲国产欧美日韩精品一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 人妻少妇精品视频专区 | 亚洲欧洲中文日韩av乱码 | 美女扒开屁股让男人桶 | 特黄特色大片免费播放器图片 | 中文字幕无码视频专区 | 久久综合激激的五月天 | 黑人巨大精品欧美一区二区 | 无码精品人妻一区二区三区av | 曰韩无码二三区中文字幕 | 国产精品久久久久久久9999 | 亚洲成a人一区二区三区 | 伊人久久婷婷五月综合97色 | 欧美性色19p | 久久精品中文闷骚内射 | 麻豆国产人妻欲求不满 | 内射巨臀欧美在线视频 | 国产偷自视频区视频 | 国产偷国产偷精品高清尤物 | 国模大胆一区二区三区 | 国产精品久久福利网站 | 99久久久无码国产精品免费 | 青青久在线视频免费观看 | 女人被爽到呻吟gif动态图视看 | 久久天天躁夜夜躁狠狠 | 欧美日韩久久久精品a片 | 久久天天躁狠狠躁夜夜免费观看 | 波多野42部无码喷潮在线 | 好男人社区资源 | 丰满少妇高潮惨叫视频 | 97无码免费人妻超级碰碰夜夜 | 精品 日韩 国产 欧美 视频 | 东京热男人av天堂 | 欧美xxxx黑人又粗又长 | 精品日本一区二区三区在线观看 | 精品成人av一区二区三区 | 久久精品国产99久久6动漫 | 男女超爽视频免费播放 | 精品午夜福利在线观看 | 久久99精品国产麻豆蜜芽 | 中文字幕av伊人av无码av | 亚洲中文无码av永久不收费 | 麻花豆传媒剧国产免费mv在线 | 亚洲色在线无码国产精品不卡 | 国产熟妇另类久久久久 | 无码一区二区三区在线 | 亚洲va中文字幕无码久久不卡 | 国产成人无码午夜视频在线观看 | 无码人妻久久一区二区三区不卡 | 国产激情无码一区二区 | 久久久久国色av免费观看性色 | 狂野欧美性猛xxxx乱大交 | 欧美自拍另类欧美综合图片区 | 中文字幕乱码人妻无码久久 | 无码播放一区二区三区 | 99精品国产综合久久久久五月天 | 亚洲色欲色欲天天天www | 亚洲精品一区三区三区在线观看 | 激情五月综合色婷婷一区二区 | 人人妻人人澡人人爽人人精品浪潮 | 日韩av激情在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 暴力强奷在线播放无码 | 性欧美videos高清精品 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲中文字幕在线无码一区二区 | 色婷婷综合激情综在线播放 | 牲欲强的熟妇农村老妇女视频 | 日韩视频 中文字幕 视频一区 | 国产欧美精品一区二区三区 | 波多野结衣aⅴ在线 | 亚洲人成人无码网www国产 | 中文字幕av无码一区二区三区电影 | 亚洲高清偷拍一区二区三区 | 亚洲人成影院在线无码按摩店 | 1000部啪啪未满十八勿入下载 | 亚洲精品国产a久久久久久 | 3d动漫精品啪啪一区二区中 | 人妻无码αv中文字幕久久琪琪布 | 双乳奶水饱满少妇呻吟 | 国产人妻精品一区二区三区不卡 | 在线看片无码永久免费视频 | 装睡被陌生人摸出水好爽 | 亚洲熟女一区二区三区 | 国产精品二区一区二区aⅴ污介绍 | 亚洲精品久久久久中文第一幕 | 国产精品久久久久9999小说 | 成人试看120秒体验区 | 熟妇人妻无码xxx视频 | 狠狠色噜噜狠狠狠狠7777米奇 | 97精品国产97久久久久久免费 | 帮老师解开蕾丝奶罩吸乳网站 | 东北女人啪啪对白 | 丰满少妇高潮惨叫视频 | 国产福利视频一区二区 | av小次郎收藏 | 婷婷色婷婷开心五月四房播播 | 麻豆果冻传媒2021精品传媒一区下载 | 蜜臀av无码人妻精品 | 无码福利日韩神码福利片 | 一本加勒比波多野结衣 | 免费视频欧美无人区码 | 国产成人无码区免费内射一片色欲 | 国产精品福利视频导航 | 超碰97人人做人人爱少妇 | 中文亚洲成a人片在线观看 | 永久黄网站色视频免费直播 | 丰满少妇熟乱xxxxx视频 | 国产九九九九九九九a片 | 中国女人内谢69xxxx | 性欧美牲交在线视频 | 国产另类ts人妖一区二区 | 久久人人爽人人爽人人片av高清 | 丰满人妻被黑人猛烈进入 | 午夜精品久久久久久久 | 岛国片人妻三上悠亚 | 无码人中文字幕 | 亚洲中文字幕久久无码 | 51国偷自产一区二区三区 | 久热国产vs视频在线观看 | 色一情一乱一伦一区二区三欧美 | 人妻少妇精品视频专区 | 亚洲国产一区二区三区在线观看 | 国产成人无码av一区二区 | 亚洲日韩av一区二区三区中文 | 一本久道久久综合婷婷五月 | 俄罗斯老熟妇色xxxx | 国产精品高潮呻吟av久久 | 亚洲s色大片在线观看 | 中文字幕乱码人妻二区三区 | 激情综合激情五月俺也去 | 大色综合色综合网站 | 精品一区二区三区无码免费视频 | 国产精品久久久久影院嫩草 | 久久久精品成人免费观看 | 丝袜足控一区二区三区 | 内射老妇bbwx0c0ck | 一区二区三区乱码在线 | 欧洲 | 亚洲精品无码人妻无码 | 免费观看的无遮挡av | 欧洲vodafone精品性 | 国产成人av免费观看 | 给我免费的视频在线观看 | 国产亚洲精品久久久久久久久动漫 | 影音先锋中文字幕无码 | 国内揄拍国内精品少妇国语 | 国产精品无码一区二区桃花视频 | 久久成人a毛片免费观看网站 | 性欧美大战久久久久久久 | 人妻无码αv中文字幕久久琪琪布 | 久久人人爽人人人人片 | 伊人久久大香线蕉亚洲 | 少妇人妻av毛片在线看 | 欧洲vodafone精品性 | 久久国产精品萌白酱免费 | 国产精品无码一区二区三区不卡 | 亚洲午夜无码久久 | 精品偷拍一区二区三区在线看 | 四十如虎的丰满熟妇啪啪 | 亚洲男人av香蕉爽爽爽爽 | 内射巨臀欧美在线视频 | 欧美人与禽zoz0性伦交 | 国产做国产爱免费视频 | 夜先锋av资源网站 | 日韩精品乱码av一区二区 | 夜先锋av资源网站 | 国模大胆一区二区三区 | 亚洲国产精品一区二区第一页 | 免费看少妇作爱视频 | 精品国产精品久久一区免费式 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品久久久av久久久 | 亚洲精品一区二区三区在线 | 99精品视频在线观看免费 | 粉嫩少妇内射浓精videos | 久久久国产精品无码免费专区 | 国产午夜精品一区二区三区嫩草 | 亚洲精品国产精品乱码不卡 | 欧美老熟妇乱xxxxx | 风流少妇按摩来高潮 | 国产97人人超碰caoprom | 无码纯肉视频在线观看 | 亚洲国产精品毛片av不卡在线 | 午夜精品一区二区三区的区别 | 欧美喷潮久久久xxxxx | 无码精品人妻一区二区三区av | 久久久久久久女国产乱让韩 | 人妻人人添人妻人人爱 | 日韩精品一区二区av在线 | av在线亚洲欧洲日产一区二区 | 亚洲精品综合五月久久小说 | 国产在线aaa片一区二区99 | 国产亚洲欧美日韩亚洲中文色 | 特级做a爰片毛片免费69 | 色噜噜亚洲男人的天堂 | 国产亚洲精品久久久久久国模美 | 国产区女主播在线观看 | 曰本女人与公拘交酡免费视频 | 色欲久久久天天天综合网精品 | 精品国产aⅴ无码一区二区 | 曰本女人与公拘交酡免费视频 | 久久无码专区国产精品s | 搡女人真爽免费视频大全 | 精品国产精品久久一区免费式 | 永久免费观看美女裸体的网站 | 欧美精品一区二区精品久久 | 狠狠综合久久久久综合网 | 人人妻人人澡人人爽人人精品浪潮 | 国产高清av在线播放 | 国产疯狂伦交大片 | 国产情侣作爱视频免费观看 | 亚洲一区二区三区 | 福利一区二区三区视频在线观看 | 天天av天天av天天透 | 无码国产激情在线观看 | 久久久久se色偷偷亚洲精品av | 免费视频欧美无人区码 | 天天做天天爱天天爽综合网 | 欧美亚洲国产一区二区三区 | 亚洲综合无码久久精品综合 | 国产色视频一区二区三区 | 国产香蕉尹人视频在线 | 牲欲强的熟妇农村老妇女视频 | 欧美黑人乱大交 | yw尤物av无码国产在线观看 | 亚洲欧美国产精品专区久久 | 日本乱偷人妻中文字幕 | 少妇性荡欲午夜性开放视频剧场 | 国产成人无码a区在线观看视频app | 一本色道婷婷久久欧美 | 亚洲精品午夜无码电影网 | 婷婷色婷婷开心五月四房播播 | 国产成人精品久久亚洲高清不卡 | 亚洲成a人片在线观看无码3d | 黑人大群体交免费视频 | 东京热男人av天堂 | 精品国产一区二区三区四区 | 国产偷抇久久精品a片69 | 国产精品免费大片 | 国内精品九九久久久精品 | 欧美老人巨大xxxx做受 | 麻豆成人精品国产免费 | 亚洲乱码中文字幕在线 | 97久久精品无码一区二区 | 欧美精品一区二区精品久久 | 欧美自拍另类欧美综合图片区 | 国产成人无码区免费内射一片色欲 | 亚洲综合另类小说色区 | 亚洲日韩精品欧美一区二区 | 欧美日韩久久久精品a片 | 国内揄拍国内精品人妻 | 一本大道伊人av久久综合 | 丰满少妇熟乱xxxxx视频 | 久久精品国产大片免费观看 | 一二三四社区在线中文视频 | 国产成人精品必看 | 精品国产av色一区二区深夜久久 | 人妻少妇被猛烈进入中文字幕 | 国产精品福利视频导航 | 亚洲精品午夜国产va久久成人 | 中文字幕日韩精品一区二区三区 | 国产精品久久福利网站 | 性欧美牲交在线视频 | 一区二区三区乱码在线 | 欧洲 | 久久无码中文字幕免费影院蜜桃 | а天堂中文在线官网 | 99在线 | 亚洲 | 日本乱偷人妻中文字幕 | 中文精品无码中文字幕无码专区 | 亚洲七七久久桃花影院 | 国产麻豆精品精东影业av网站 | 欧美变态另类xxxx | v一区无码内射国产 | 黑人大群体交免费视频 | 国产激情精品一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 亚洲人成网站色7799 | 国产又粗又硬又大爽黄老大爷视 | 亚洲精品综合一区二区三区在线 | 国产在线一区二区三区四区五区 | 国语自产偷拍精品视频偷 | 亚洲日本va午夜在线电影 | 成人性做爰aaa片免费看不忠 | 国产精品久久久久无码av色戒 | 呦交小u女精品视频 | 亚洲精品成人av在线 | 亚洲熟妇色xxxxx欧美老妇y | 久久精品99久久香蕉国产色戒 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产免费久久精品国产传媒 | 国产午夜福利亚洲第一 | 无码人妻出轨黑人中文字幕 | 男人扒开女人内裤强吻桶进去 | 人妻人人添人妻人人爱 | 亚洲第一网站男人都懂 | 国产女主播喷水视频在线观看 | 国产午夜精品一区二区三区嫩草 | 蜜臀aⅴ国产精品久久久国产老师 | 亚欧洲精品在线视频免费观看 | a片免费视频在线观看 | 国产成人精品一区二区在线小狼 | 国产精品视频免费播放 | 99国产欧美久久久精品 | 中文久久乱码一区二区 | 无码人妻丰满熟妇区五十路百度 | www国产精品内射老师 | 亚洲爆乳无码专区 | 99麻豆久久久国产精品免费 | 99久久久无码国产aaa精品 | 少妇高潮一区二区三区99 | 亚洲日韩av一区二区三区四区 | 亚洲精品国产品国语在线观看 | 3d动漫精品啪啪一区二区中 | 亚洲精品久久久久久久久久久 | 久久熟妇人妻午夜寂寞影院 | 亚洲成av人在线观看网址 | 学生妹亚洲一区二区 | 国产精品无码一区二区桃花视频 | 午夜精品一区二区三区在线观看 | 九九久久精品国产免费看小说 | av无码不卡在线观看免费 | 亚洲中文字幕久久无码 | 国产精品人人爽人人做我的可爱 | 娇妻被黑人粗大高潮白浆 | 久久亚洲中文字幕无码 | 国产成人精品视频ⅴa片软件竹菊 | √天堂中文官网8在线 | 久久精品人人做人人综合 | 日韩少妇内射免费播放 | 国产精品理论片在线观看 | 亚洲欧美日韩综合久久久 | 日日摸夜夜摸狠狠摸婷婷 | 婷婷六月久久综合丁香 | 国产成人精品久久亚洲高清不卡 | 亚洲中文字幕无码中文字在线 | 亚洲精品鲁一鲁一区二区三区 | 丰满少妇弄高潮了www | 欧美精品一区二区精品久久 | 永久黄网站色视频免费直播 | 亚洲经典千人经典日产 | 国产猛烈高潮尖叫视频免费 | 99精品久久毛片a片 | 欧美日韩综合一区二区三区 | 全球成人中文在线 | 精品国产乱码久久久久乱码 | 国产成人无码专区 | 无码精品国产va在线观看dvd | 精品人妻人人做人人爽夜夜爽 | 亚洲人成网站色7799 | 丰满护士巨好爽好大乳 | 亚洲中文字幕在线观看 | 欧美丰满少妇xxxx性 | 内射爽无广熟女亚洲 | 精品久久久久久亚洲精品 | 熟女少妇人妻中文字幕 | 国产精品久久国产三级国 | 无码一区二区三区在线观看 | 在教室伦流澡到高潮hnp视频 | 高潮喷水的毛片 | 中文字幕无码热在线视频 | 天天躁日日躁狠狠躁免费麻豆 | 久久午夜无码鲁丝片秋霞 | 国产亚洲精品久久久久久久 | 性色欲网站人妻丰满中文久久不卡 | 人妻少妇被猛烈进入中文字幕 | 久久久精品成人免费观看 | 色情久久久av熟女人妻网站 | 亚洲精品午夜无码电影网 | 高潮喷水的毛片 | 免费国产成人高清在线观看网站 | 欧美成人免费全部网站 | 精品欧美一区二区三区久久久 | 亚洲成色在线综合网站 | 亚洲a无码综合a国产av中文 | 97久久超碰中文字幕 | 无遮挡啪啪摇乳动态图 | 成人毛片一区二区 | 国产人妻久久精品二区三区老狼 | 牛和人交xxxx欧美 | 无码毛片视频一区二区本码 | 亚洲熟悉妇女xxx妇女av | 亚洲精品一区三区三区在线观看 | 国产成人综合在线女婷五月99播放 | 亚洲日本va中文字幕 | 网友自拍区视频精品 | 欧美肥老太牲交大战 | 婷婷丁香六月激情综合啪 | 天堂а√在线中文在线 | 乱人伦人妻中文字幕无码久久网 | 人人超人人超碰超国产 | 久久国产精品_国产精品 | 性做久久久久久久久 | 亚洲春色在线视频 | 午夜成人1000部免费视频 | 亚洲色欲色欲欲www在线 | 国产成人精品一区二区在线小狼 | 免费看男女做好爽好硬视频 | 熟女俱乐部五十路六十路av | 99er热精品视频 | 国产欧美精品一区二区三区 | 丁香花在线影院观看在线播放 | 国产亚洲精品久久久久久 | 人人妻人人澡人人爽人人精品浪潮 | 久久亚洲国产成人精品性色 | 色欲人妻aaaaaaa无码 | 蜜桃臀无码内射一区二区三区 | 成人免费视频视频在线观看 免费 | 亚洲精品一区二区三区婷婷月 | 国产肉丝袜在线观看 | 亚洲中文字幕久久无码 | 久久久中文字幕日本无吗 | 成人一在线视频日韩国产 | 久久久精品国产sm最大网站 | 国产精品无码mv在线观看 | 曰本女人与公拘交酡免费视频 | 久久aⅴ免费观看 | 国产精品人人爽人人做我的可爱 | 人妻互换免费中文字幕 | 福利一区二区三区视频在线观看 | 久久99精品久久久久久动态图 | 大乳丰满人妻中文字幕日本 | 99久久人妻精品免费二区 | 东京热一精品无码av | 国产熟妇高潮叫床视频播放 | 熟妇人妻无乱码中文字幕 | 亚洲国产欧美在线成人 | 偷窥村妇洗澡毛毛多 | 最近免费中文字幕中文高清百度 | 无码精品国产va在线观看dvd | 人人妻人人澡人人爽欧美一区九九 | 激情五月综合色婷婷一区二区 | 内射欧美老妇wbb | 性欧美熟妇videofreesex | 国产极品视觉盛宴 | 亚洲中文字幕va福利 | 日韩精品无码一区二区中文字幕 | 日本成熟视频免费视频 | 久9re热视频这里只有精品 | 人人妻人人澡人人爽欧美一区 | 日韩少妇白浆无码系列 | 国产乡下妇女做爰 | 久久久久久久人妻无码中文字幕爆 | 粗大的内捧猛烈进出视频 | 亚欧洲精品在线视频免费观看 | 九九久久精品国产免费看小说 | 久久99精品久久久久久 | 天堂а√在线地址中文在线 | www国产精品内射老师 | 亚洲午夜无码久久 | 精品国偷自产在线 | 亚洲狠狠婷婷综合久久 | 亚洲人成网站在线播放942 | 亚洲成av人在线观看网址 | 无码人妻av免费一区二区三区 | аⅴ资源天堂资源库在线 | 无码av免费一区二区三区试看 | 国产精品久久久午夜夜伦鲁鲁 | 六月丁香婷婷色狠狠久久 | 久久久久亚洲精品男人的天堂 | 国内丰满熟女出轨videos | 国产精品无码久久av | 久久久久久av无码免费看大片 | 精品午夜福利在线观看 | 日本一本二本三区免费 | 国产又爽又黄又刺激的视频 | 色一情一乱一伦一视频免费看 | 国内精品久久毛片一区二区 | 亚洲色成人中文字幕网站 | 国产精品久久久久影院嫩草 | 一本久久a久久精品vr综合 | 国产两女互慰高潮视频在线观看 | 曰韩无码二三区中文字幕 | 日本精品人妻无码免费大全 | 未满小14洗澡无码视频网站 | 精品久久久久久亚洲精品 | 日韩精品a片一区二区三区妖精 | 国产精品无套呻吟在线 | 中文字幕无码热在线视频 | 日日夜夜撸啊撸 | 粗大的内捧猛烈进出视频 | 无遮挡国产高潮视频免费观看 | 国产性生交xxxxx无码 | 中文字幕av伊人av无码av | 99久久人妻精品免费二区 | 日韩视频 中文字幕 视频一区 | 中文字幕无码热在线视频 | 国内老熟妇对白xxxxhd | 日韩av无码中文无码电影 | 日本www一道久久久免费榴莲 | 亚洲国产av美女网站 | 激情亚洲一区国产精品 | 无码av免费一区二区三区试看 | 国产精品亚洲五月天高清 | 亚洲性无码av中文字幕 | 亚洲国精产品一二二线 | 天堂久久天堂av色综合 | 四虎国产精品一区二区 | 国产97在线 | 亚洲 | 一区二区三区乱码在线 | 欧洲 | 精品偷自拍另类在线观看 | 无套内谢老熟女 | 欧美激情内射喷水高潮 | 一个人免费观看的www视频 | 少妇无码吹潮 | 欧美 丝袜 自拍 制服 另类 | 波多野结衣aⅴ在线 | 无码中文字幕色专区 | 丁香花在线影院观看在线播放 | 国产人妖乱国产精品人妖 | 国内老熟妇对白xxxxhd | 日韩欧美成人免费观看 | 人人妻人人澡人人爽欧美一区九九 | 中文字幕无码日韩专区 | 亚洲国精产品一二二线 | 亚洲中文字幕乱码av波多ji | 亚洲精品成a人在线观看 | 男女作爱免费网站 | 国产精品国产三级国产专播 | 亚洲一区二区三区国产精华液 | 激情国产av做激情国产爱 | 97资源共享在线视频 | 精品人妻中文字幕有码在线 | 欧美日韩在线亚洲综合国产人 | 欧美激情内射喷水高潮 | 中文字幕乱码亚洲无线三区 | 强伦人妻一区二区三区视频18 | 国产 精品 自在自线 | 色综合久久久无码中文字幕 | 小sao货水好多真紧h无码视频 | 国产成人无码av在线影院 | 一二三四社区在线中文视频 | 老熟女乱子伦 | 大地资源网第二页免费观看 | 欧美野外疯狂做受xxxx高潮 | 亚洲国产日韩a在线播放 | 呦交小u女精品视频 | 久久综合久久自在自线精品自 | 久久人人爽人人人人片 | 日日摸夜夜摸狠狠摸婷婷 | 精品国产av色一区二区深夜久久 | 国产乡下妇女做爰 | 极品嫩模高潮叫床 | 亚洲色无码一区二区三区 | 欧美自拍另类欧美综合图片区 | 亚洲中文字幕无码中文字在线 | www一区二区www免费 | 伊人久久大香线蕉亚洲 | 国产午夜手机精彩视频 | 性做久久久久久久久 | 4hu四虎永久在线观看 | 日本一卡2卡3卡四卡精品网站 | 国产激情艳情在线看视频 | 国产av一区二区精品久久凹凸 | 熟女体下毛毛黑森林 | 国产成人无码a区在线观看视频app | 色综合天天综合狠狠爱 | 亚洲第一网站男人都懂 | 亚洲成av人综合在线观看 | 波多野结衣一区二区三区av免费 | 日本欧美一区二区三区乱码 | 狠狠躁日日躁夜夜躁2020 | 免费看男女做好爽好硬视频 | 亚洲一区二区三区偷拍女厕 | 亚洲人成人无码网www国产 | 亚洲综合久久一区二区 | 爱做久久久久久 | 国产av无码专区亚洲awww | 国产成人无码专区 | 老头边吃奶边弄进去呻吟 | 一本色道婷婷久久欧美 | 精品日本一区二区三区在线观看 | 日本精品少妇一区二区三区 | 无码国产激情在线观看 | 久久这里只有精品视频9 | 亚洲中文字幕va福利 | 亚洲aⅴ无码成人网站国产app | 亚洲人成网站色7799 | 又湿又紧又大又爽a视频国产 | 高清无码午夜福利视频 | 国产亚洲人成在线播放 | 国产精品久久久久无码av色戒 | 亚洲色偷偷偷综合网 | 全球成人中文在线 | 噜噜噜亚洲色成人网站 | 久久精品女人的天堂av | 精品欧洲av无码一区二区三区 | 成人片黄网站色大片免费观看 | 亚洲午夜无码久久 | 成人精品视频一区二区 | 老熟妇仑乱视频一区二区 | 国内精品久久毛片一区二区 | 欧美变态另类xxxx | 无码国产色欲xxxxx视频 | 亚洲日韩av片在线观看 | 纯爱无遮挡h肉动漫在线播放 | 日韩精品乱码av一区二区 | 乱人伦人妻中文字幕无码 | 亚洲色成人中文字幕网站 | 亚洲性无码av中文字幕 | 色偷偷人人澡人人爽人人模 | 日本丰满护士爆乳xxxx | 免费国产黄网站在线观看 | 欧洲精品码一区二区三区免费看 | 国产精品无码mv在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 樱花草在线社区www | 欧美性黑人极品hd | 大肉大捧一进一出好爽视频 | 日韩视频 中文字幕 视频一区 | 中文字幕久久久久人妻 | 超碰97人人做人人爱少妇 | 麻豆国产丝袜白领秘书在线观看 | 精品日本一区二区三区在线观看 | 久久午夜无码鲁丝片 | 奇米影视7777久久精品 | 国产精品亚洲综合色区韩国 | 国产高清av在线播放 | 久久久久av无码免费网 | 成人免费视频一区二区 | 久久97精品久久久久久久不卡 | 黄网在线观看免费网站 | 纯爱无遮挡h肉动漫在线播放 | 色噜噜亚洲男人的天堂 | 狠狠色丁香久久婷婷综合五月 | 伊人久久大香线蕉午夜 | 中文字幕日韩精品一区二区三区 | 天堂亚洲免费视频 | 少妇人妻av毛片在线看 | 国产精品丝袜黑色高跟鞋 | 国产精品久久久久无码av色戒 | 国产偷国产偷精品高清尤物 | 人人妻人人澡人人爽欧美一区九九 | 人人澡人人妻人人爽人人蜜桃 | 久久午夜无码鲁丝片 | 久久久久久九九精品久 | 欧美35页视频在线观看 | 一本加勒比波多野结衣 | 高潮喷水的毛片 | 亚洲s色大片在线观看 | 鲁一鲁av2019在线 | 国精产品一区二区三区 | 欧美日本日韩 | 精品无码一区二区三区的天堂 | 国产精品国产三级国产专播 | 精品国产aⅴ无码一区二区 | 未满成年国产在线观看 | 精品国产成人一区二区三区 | 日韩少妇内射免费播放 | 国产人妻人伦精品1国产丝袜 | 国产莉萝无码av在线播放 | 亚洲精品www久久久 | 欧美色就是色 | 国产色视频一区二区三区 | 中文字幕人妻无码一夲道 | 亚洲中文无码av永久不收费 | 亚洲欧洲无卡二区视頻 | 国产精华av午夜在线观看 | 亚洲乱码中文字幕在线 | 少妇久久久久久人妻无码 | 黑人大群体交免费视频 | 日韩少妇白浆无码系列 | 老子影院午夜精品无码 | 亚洲欧美日韩国产精品一区二区 | 日韩人妻无码一区二区三区久久99 | 色欲av亚洲一区无码少妇 | 亚洲精品国偷拍自产在线麻豆 | 一个人看的www免费视频在线观看 | 丁香花在线影院观看在线播放 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲 另类 在线 欧美 制服 | 国产亚洲视频中文字幕97精品 | 国产精品久久久久影院嫩草 | 无码av岛国片在线播放 | 狂野欧美性猛xxxx乱大交 | 国产精品国产三级国产专播 | 日韩欧美群交p片內射中文 | 免费人成在线观看网站 | 亚洲自偷自拍另类第1页 | 日本va欧美va欧美va精品 | 中文字幕人成乱码熟女app | 亚洲日本va中文字幕 | 亚洲国产精品无码一区二区三区 | 亚洲精品久久久久久一区二区 | 国产av人人夜夜澡人人爽麻豆 | 四十如虎的丰满熟妇啪啪 | 国精产品一区二区三区 | 国产成人无码av在线影院 | 亚洲精品中文字幕 | 狠狠色噜噜狠狠狠7777奇米 | 正在播放老肥熟妇露脸 | 中国大陆精品视频xxxx | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 四虎国产精品一区二区 | 色婷婷久久一区二区三区麻豆 | 日产精品99久久久久久 | a国产一区二区免费入口 | 无码国产乱人伦偷精品视频 | 嫩b人妻精品一区二区三区 | 久久久精品国产sm最大网站 | 伊人久久大香线焦av综合影院 | 久久综合狠狠综合久久综合88 | 欧美日韩色另类综合 | 久久久久久久久888 | 亚洲欧洲中文日韩av乱码 | 影音先锋中文字幕无码 | 水蜜桃色314在线观看 | 成人一区二区免费视频 | 婷婷五月综合缴情在线视频 | 亚洲欧美中文字幕5发布 | 亚洲精品成a人在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久人人爽人人人人片 | 狠狠色色综合网站 | 久久久久99精品成人片 | 中文字幕无线码 | 美女毛片一区二区三区四区 | 在线欧美精品一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 正在播放老肥熟妇露脸 | 色诱久久久久综合网ywww | 青春草在线视频免费观看 | 欧美肥老太牲交大战 | 亚洲国产精品一区二区美利坚 | 亚洲а∨天堂久久精品2021 | 国产卡一卡二卡三 | 国产精品久免费的黄网站 | 国产亚av手机在线观看 | 美女扒开屁股让男人桶 | 国产特级毛片aaaaaa高潮流水 | 嫩b人妻精品一区二区三区 | 国产精品无码久久av | 精品夜夜澡人妻无码av蜜桃 | 国产精品怡红院永久免费 | 亚洲精品成a人在线观看 | 初尝人妻少妇中文字幕 | 成人亚洲精品久久久久 | av无码电影一区二区三区 | 在线天堂新版最新版在线8 | 老子影院午夜精品无码 | 无码人妻少妇伦在线电影 | 欧美丰满老熟妇xxxxx性 | 精品人人妻人人澡人人爽人人 | 无遮无挡爽爽免费视频 | 东京无码熟妇人妻av在线网址 | 国产免费久久久久久无码 | 夫妻免费无码v看片 | 日欧一片内射va在线影院 | 任你躁国产自任一区二区三区 | 亚洲成av人在线观看网址 | aa片在线观看视频在线播放 | 亚洲精品一区二区三区在线 | 久久久久免费精品国产 | 色欲久久久天天天综合网精品 | a在线亚洲男人的天堂 | 亚洲精品久久久久中文第一幕 | 女人和拘做爰正片视频 | 中文字幕乱码中文乱码51精品 | 亚洲区小说区激情区图片区 | 日本又色又爽又黄的a片18禁 | 欧美熟妇另类久久久久久多毛 | 成人aaa片一区国产精品 | 亚洲日韩中文字幕在线播放 | 日日摸天天摸爽爽狠狠97 | 在线精品亚洲一区二区 | 最新国产麻豆aⅴ精品无码 | 精品国产成人一区二区三区 | 色综合久久88色综合天天 | 精品国偷自产在线 | 97夜夜澡人人双人人人喊 | 亚洲精品一区二区三区在线观看 | 成人片黄网站色大片免费观看 | 久久综合九色综合欧美狠狠 | 丰满少妇人妻久久久久久 | 天天拍夜夜添久久精品大 | 国产精品亚洲五月天高清 | 色狠狠av一区二区三区 | 欧美日韩人成综合在线播放 | 对白脏话肉麻粗话av | 亚洲精品国偷拍自产在线麻豆 | 少妇无码一区二区二三区 | 人妻少妇精品无码专区动漫 | 中文字幕 人妻熟女 | 人妻尝试又大又粗久久 | 高清不卡一区二区三区 | 丝袜人妻一区二区三区 | 国产香蕉尹人视频在线 | 免费男性肉肉影院 | 爱做久久久久久 | 国产成人精品视频ⅴa片软件竹菊 | 中文字幕无码免费久久9一区9 | 久久久成人毛片无码 | 国产欧美精品一区二区三区 | 午夜精品一区二区三区的区别 | 日韩精品一区二区av在线 | 熟妇人妻无乱码中文字幕 | 好爽又高潮了毛片免费下载 | 无码人妻久久一区二区三区不卡 | 窝窝午夜理论片影院 | 日日碰狠狠丁香久燥 | 久久久成人毛片无码 | 又大又黄又粗又爽的免费视频 | 一个人看的www免费视频在线观看 | 国产精品久久久久无码av色戒 | 丝袜 中出 制服 人妻 美腿 | 蜜臀av在线播放 久久综合激激的五月天 | 欧美三级不卡在线观看 | 国产精品高潮呻吟av久久 | www国产亚洲精品久久网站 | 色噜噜亚洲男人的天堂 | 久久国产自偷自偷免费一区调 | 国产成人精品久久亚洲高清不卡 | 国产乡下妇女做爰 | 大屁股大乳丰满人妻 | 人妻少妇精品视频专区 | 精品亚洲韩国一区二区三区 | 黑人巨大精品欧美一区二区 | 亚洲国产精品毛片av不卡在线 | 亚洲人成网站色7799 | 国产9 9在线 | 中文 | 少妇无码av无码专区在线观看 | av在线亚洲欧洲日产一区二区 | 午夜福利试看120秒体验区 | 十八禁视频网站在线观看 | yw尤物av无码国产在线观看 | 成人欧美一区二区三区 | a国产一区二区免费入口 | 国产超级va在线观看视频 | 蜜臀av无码人妻精品 | 成 人影片 免费观看 | 97精品人妻一区二区三区香蕉 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美xxxxx精品 | 大肉大捧一进一出好爽视频 | 在线观看国产一区二区三区 | 国产精品人人爽人人做我的可爱 | 清纯唯美经典一区二区 | 国产亚洲日韩欧美另类第八页 | 日韩精品无码一本二本三本色 | 国产激情一区二区三区 | 99精品国产综合久久久久五月天 | 六月丁香婷婷色狠狠久久 | 中文字幕无码免费久久99 | 黑人大群体交免费视频 | 精品偷拍一区二区三区在线看 | 亚洲日韩av一区二区三区四区 | 影音先锋中文字幕无码 | 欧洲欧美人成视频在线 | 成人欧美一区二区三区黑人免费 | 亚洲精品一区二区三区婷婷月 | 国产猛烈高潮尖叫视频免费 | 亚洲熟悉妇女xxx妇女av | 国产精品毛片一区二区 | 国产亚洲tv在线观看 | 亚洲一区二区三区无码久久 | 日韩av无码中文无码电影 | 黑人玩弄人妻中文在线 | 亚洲热妇无码av在线播放 | 国产精品久久国产三级国 | 国产精品毛多多水多 | 爽爽影院免费观看 | 亚洲精品国偷拍自产在线麻豆 | 中文字幕久久久久人妻 | 久久久久免费精品国产 | 亚洲一区av无码专区在线观看 | 免费无码午夜福利片69 | 色综合久久88色综合天天 | 久久久久亚洲精品男人的天堂 | 亚洲精品一区二区三区大桥未久 | 在线成人www免费观看视频 | 国精品人妻无码一区二区三区蜜柚 | 小鲜肉自慰网站xnxx | 2020久久超碰国产精品最新 | 伦伦影院午夜理论片 | 国产人妻久久精品二区三区老狼 | a在线亚洲男人的天堂 | 99久久99久久免费精品蜜桃 | 永久免费精品精品永久-夜色 | 免费国产成人高清在线观看网站 | 久久久久免费看成人影片 | 精品国产av色一区二区深夜久久 | 无码福利日韩神码福利片 | 国产香蕉尹人视频在线 | 性欧美videos高清精品 | 蜜臀aⅴ国产精品久久久国产老师 | 男人的天堂2018无码 | 欧美日韩综合一区二区三区 | 亚洲理论电影在线观看 | 黑人巨大精品欧美一区二区 | 国产无遮挡又黄又爽又色 | 欧美自拍另类欧美综合图片区 | 人人爽人人澡人人高潮 | 国产成人午夜福利在线播放 | 性欧美牲交xxxxx视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 曰韩无码二三区中文字幕 | 亚洲精品午夜国产va久久成人 | 日韩亚洲欧美中文高清在线 | 亚洲一区二区三区香蕉 | 国产精华av午夜在线观看 | 亚洲乱亚洲乱妇50p | 无码人妻黑人中文字幕 | 日日噜噜噜噜夜夜爽亚洲精品 | 无码人妻黑人中文字幕 | 久青草影院在线观看国产 | 成人毛片一区二区 | 国产福利视频一区二区 | 玩弄中年熟妇正在播放 | 亚洲一区二区观看播放 | 亚洲精品一区二区三区四区五区 | 18精品久久久无码午夜福利 | 亚洲国产精品成人久久蜜臀 | 国产成人av免费观看 | 成人免费视频在线观看 | 亚洲日韩av片在线观看 | 免费乱码人妻系列无码专区 | 网友自拍区视频精品 | 西西人体www44rt大胆高清 | 日本一本二本三区免费 | 国产欧美熟妇另类久久久 | 久久精品无码一区二区三区 | 好爽又高潮了毛片免费下载 | 性做久久久久久久久 | 免费无码肉片在线观看 | 日本精品人妻无码免费大全 | 97人妻精品一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲小说春色综合另类 | 国产亚av手机在线观看 | 亚洲国产精品一区二区第一页 | 中文字幕精品av一区二区五区 | 日本乱偷人妻中文字幕 | 精品偷拍一区二区三区在线看 | 色老头在线一区二区三区 | 亚洲国产综合无码一区 | 久久久久亚洲精品中文字幕 | 成人毛片一区二区 | 无码人妻出轨黑人中文字幕 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲 欧美 激情 小说 另类 | 亚洲区欧美区综合区自拍区 | 久久精品国产日本波多野结衣 | 3d动漫精品啪啪一区二区中 | 亚洲国产精品久久久久久 | 内射老妇bbwx0c0ck | 内射老妇bbwx0c0ck | 18黄暴禁片在线观看 | 一本大道伊人av久久综合 | 日本丰满护士爆乳xxxx | 日本精品人妻无码免费大全 | 久久久中文久久久无码 | 久久www免费人成人片 | 国产绳艺sm调教室论坛 | 日韩av激情在线观看 | 18禁黄网站男男禁片免费观看 | 又湿又紧又大又爽a视频国产 | 国产色在线 | 国产 | 国内揄拍国内精品少妇国语 | 亚洲人交乣女bbw | 在线精品国产一区二区三区 | 在线精品亚洲一区二区 | 扒开双腿吃奶呻吟做受视频 | 欧美性生交活xxxxxdddd | 国产精品嫩草久久久久 | 国产激情无码一区二区 | 精品久久久久香蕉网 | 亚洲国产精品无码一区二区三区 | 55夜色66夜色国产精品视频 | 妺妺窝人体色www婷婷 | 欧美精品一区二区精品久久 | 久久久久免费精品国产 | 久久精品中文闷骚内射 | 亚洲国产精品毛片av不卡在线 | 激情内射亚州一区二区三区爱妻 | 国产精品怡红院永久免费 | 又湿又紧又大又爽a视频国产 | 亚洲无人区午夜福利码高清完整版 | 国産精品久久久久久久 | 99久久精品国产一区二区蜜芽 | 在线播放免费人成毛片乱码 | 久久久久久久久888 | 激情爆乳一区二区三区 | 国产色在线 | 国产 | 国产三级精品三级男人的天堂 | 亚洲精品一区三区三区在线观看 | 久久国产精品萌白酱免费 | 久久久久av无码免费网 | 国精产品一品二品国精品69xx | 欧美精品免费观看二区 | 香港三级日本三级妇三级 | 久久午夜无码鲁丝片午夜精品 | 国产精品久久国产精品99 | 日本高清一区免费中文视频 | 精品欧美一区二区三区久久久 | 成人aaa片一区国产精品 | 成人女人看片免费视频放人 | 精品欧洲av无码一区二区三区 | 国产精品久久久久久亚洲影视内衣 | 国产激情一区二区三区 | av在线亚洲欧洲日产一区二区 | 日韩欧美群交p片內射中文 | 久精品国产欧美亚洲色aⅴ大片 | 色一情一乱一伦一区二区三欧美 | 久久精品人妻少妇一区二区三区 | 国产欧美亚洲精品a | 人妻夜夜爽天天爽三区 | 久久久成人毛片无码 | 日本乱偷人妻中文字幕 | 亚洲国产精品无码一区二区三区 | 亚洲中文字幕乱码av波多ji | 熟女体下毛毛黑森林 | 三上悠亚人妻中文字幕在线 | 中文字幕乱码人妻无码久久 | 精品一区二区三区波多野结衣 | 未满成年国产在线观看 | 性生交片免费无码看人 | 四虎影视成人永久免费观看视频 | 台湾无码一区二区 | 7777奇米四色成人眼影 | 色狠狠av一区二区三区 | 欧美变态另类xxxx | 欧美丰满熟妇xxxx性ppx人交 | 人妻中文无码久热丝袜 | 漂亮人妻洗澡被公强 日日躁 | 对白脏话肉麻粗话av | 国产精品久免费的黄网站 | 国产无遮挡又黄又爽又色 | 欧美35页视频在线观看 | 国产日产欧产精品精品app | 东京无码熟妇人妻av在线网址 | 婷婷五月综合缴情在线视频 | 中文无码成人免费视频在线观看 | 亚洲精品一区二区三区在线观看 | 伊人久久大香线蕉av一区二区 | 国产口爆吞精在线视频 | 国产亚洲精品久久久闺蜜 | 欧美日韩久久久精品a片 | 久久精品丝袜高跟鞋 | 1000部夫妻午夜免费 | 初尝人妻少妇中文字幕 | 久久综合给合久久狠狠狠97色 | 蜜桃视频韩日免费播放 | 99精品国产综合久久久久五月天 | 日韩人妻无码一区二区三区久久99 | 精品无码国产自产拍在线观看蜜 | 欧美老熟妇乱xxxxx | 一个人看的视频www在线 | 一本精品99久久精品77 | 成人无码精品一区二区三区 | 巨爆乳无码视频在线观看 | 国产97人人超碰caoprom | 久久午夜夜伦鲁鲁片无码免费 | 成年美女黄网站色大免费全看 | 亚洲成色www久久网站 | 亚洲 欧美 激情 小说 另类 | 午夜精品久久久内射近拍高清 | 久久无码中文字幕免费影院蜜桃 | 国内揄拍国内精品人妻 | 国产成人无码a区在线观看视频app | 国产美女精品一区二区三区 | 日韩在线不卡免费视频一区 | 国产真实乱对白精彩久久 | 东京热无码av男人的天堂 | 欧美激情综合亚洲一二区 | 婷婷综合久久中文字幕蜜桃三电影 | 精品欧美一区二区三区久久久 | 精品夜夜澡人妻无码av蜜桃 | 成人影院yy111111在线观看 | 正在播放老肥熟妇露脸 | 免费无码午夜福利片69 | 未满成年国产在线观看 | 狠狠综合久久久久综合网 | 一本精品99久久精品77 | 日韩无码专区 | 无码乱肉视频免费大全合集 | 夜夜夜高潮夜夜爽夜夜爰爰 | 麻豆成人精品国产免费 | 激情综合激情五月俺也去 | 无遮挡啪啪摇乳动态图 | 伊人久久大香线蕉av一区二区 | 99久久久无码国产精品免费 | 76少妇精品导航 | 成人无码影片精品久久久 | 波多野结衣一区二区三区av免费 | 在线看片无码永久免费视频 | 波多野结衣高清一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 国产 精品 自在自线 | 欧洲美熟女乱又伦 | 18无码粉嫩小泬无套在线观看 | 性色欲网站人妻丰满中文久久不卡 | 亚洲国产成人a精品不卡在线 | 国精产品一品二品国精品69xx | 国产在线aaa片一区二区99 | 精品久久8x国产免费观看 | 99久久婷婷国产综合精品青草免费 | 国产明星裸体无码xxxx视频 | 国产成人无码一二三区视频 | 波多野42部无码喷潮在线 | 中文久久乱码一区二区 | 丰腴饱满的极品熟妇 | 欧美人与动性行为视频 | 久久久国产一区二区三区 | 日韩av激情在线观看 | 久久综合九色综合欧美狠狠 | 夜夜影院未满十八勿进 | 亚洲阿v天堂在线 | 亚洲成av人在线观看网址 | 男女猛烈xx00免费视频试看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲欧美日韩成人高清在线一区 | 国产极品视觉盛宴 | 欧美老人巨大xxxx做受 | 亚洲 另类 在线 欧美 制服 | 久久午夜无码鲁丝片秋霞 | 激情综合激情五月俺也去 | 国内精品人妻无码久久久影院蜜桃 | 国产乱人偷精品人妻a片 | 国产精品嫩草久久久久 | 捆绑白丝粉色jk震动捧喷白浆 | 人人妻人人澡人人爽精品欧美 | 国产精品爱久久久久久久 | 亚洲精品午夜国产va久久成人 | 日日躁夜夜躁狠狠躁 | 国产精品无码一区二区三区不卡 | 日韩欧美成人免费观看 | 久久精品人妻少妇一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 2019午夜福利不卡片在线 | 国产精品久久久av久久久 | 2020久久超碰国产精品最新 | 欧美freesex黑人又粗又大 | 欧美精品免费观看二区 | 久久97精品久久久久久久不卡 | 久久99久久99精品中文字幕 | 国产无遮挡又黄又爽免费视频 | 国产亚洲精品久久久闺蜜 | 欧美自拍另类欧美综合图片区 | 精品无码国产一区二区三区av | 日本一卡2卡3卡四卡精品网站 | 在线视频网站www色 | 久久久久国色av免费观看性色 | 久久精品国产一区二区三区 | 内射巨臀欧美在线视频 | 野外少妇愉情中文字幕 | 国产又爽又猛又粗的视频a片 | 亚洲精品一区三区三区在线观看 | 久久国产自偷自偷免费一区调 | 中文字幕日韩精品一区二区三区 | 性生交大片免费看l | 久久久久久a亚洲欧洲av冫 | 国产精品亚洲а∨无码播放麻豆 | 久久综合激激的五月天 | 久久精品中文字幕大胸 | 国产特级毛片aaaaaaa高清 | 久久精品成人欧美大片 | 亚洲精品一区二区三区四区五区 | 亚洲国产成人a精品不卡在线 | 国产在线无码精品电影网 | 性色欲网站人妻丰满中文久久不卡 | 老子影院午夜精品无码 | 久久99精品久久久久久 | 夫妻免费无码v看片 | 无码任你躁久久久久久久 | 天天摸天天碰天天添 | 国产凸凹视频一区二区 | 成人无码视频在线观看网站 | 久久久久久久久888 | 日本精品人妻无码免费大全 | 玩弄少妇高潮ⅹxxxyw | 精品偷拍一区二区三区在线看 | 久久久久久久女国产乱让韩 | 久久天天躁狠狠躁夜夜免费观看 | 日本一区二区更新不卡 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产无套粉嫩白浆在线 | 亚洲最大成人网站 | 97夜夜澡人人双人人人喊 | 国产成人精品优优av | 久久国产精品精品国产色婷婷 | 内射巨臀欧美在线视频 | 无码人妻丰满熟妇区毛片18 | 高潮毛片无遮挡高清免费 | 亚洲综合无码一区二区三区 | 欧洲美熟女乱又伦 | 九九在线中文字幕无码 | 国产午夜无码视频在线观看 | 久久亚洲中文字幕精品一区 | 亚洲中文字幕无码中文字在线 | 亚洲一区二区三区香蕉 | 国产日产欧产精品精品app | 欧美性黑人极品hd | 亚洲精品国产第一综合99久久 | 中文字幕无码av激情不卡 | 77777熟女视频在线观看 а天堂中文在线官网 | 1000部啪啪未满十八勿入下载 | 国产麻豆精品精东影业av网站 | 亚洲日韩av一区二区三区中文 | 狠狠色欧美亚洲狠狠色www | 亚洲 a v无 码免 费 成 人 a v | 亚洲乱码中文字幕在线 | 日韩精品无码一区二区中文字幕 | 女高中生第一次破苞av | 少妇性l交大片 | 国产亚洲精品精品国产亚洲综合 | 99国产精品白浆在线观看免费 | 97夜夜澡人人爽人人喊中国片 | 少妇无码av无码专区在线观看 | 丁香花在线影院观看在线播放 | 精品久久综合1区2区3区激情 | 久久精品国产99久久6动漫 | 国产精品视频免费播放 | 亚洲国产精品一区二区第一页 | 亚洲va欧美va天堂v国产综合 | 妺妺窝人体色www在线小说 | 亚洲熟妇色xxxxx亚洲 | 亚洲日韩一区二区三区 | 成熟女人特级毛片www免费 | 欧美真人作爱免费视频 | 国产偷抇久久精品a片69 | 国产97色在线 | 免 | 久久久亚洲欧洲日产国码αv | 九九在线中文字幕无码 | 在线观看国产一区二区三区 | 国产偷自视频区视频 | 色综合久久久无码网中文 | 国产熟妇另类久久久久 | 性色欲网站人妻丰满中文久久不卡 | 日本www一道久久久免费榴莲 | 欧美性黑人极品hd | 久久亚洲国产成人精品性色 | 久久zyz资源站无码中文动漫 | 亚洲熟妇色xxxxx亚洲 | 国产日产欧产精品精品app | 少女韩国电视剧在线观看完整 | 亚洲精品久久久久久久久久久 | 俄罗斯老熟妇色xxxx | 国产免费无码一区二区视频 | 国产精品自产拍在线观看 | 久久精品人人做人人综合试看 | 窝窝午夜理论片影院 | 麻豆国产丝袜白领秘书在线观看 | 人人妻人人藻人人爽欧美一区 | 青青青手机频在线观看 | 露脸叫床粗话东北少妇 | 久久国内精品自在自线 | 国产精品永久免费视频 | 中文精品无码中文字幕无码专区 | 最新国产麻豆aⅴ精品无码 | 清纯唯美经典一区二区 | 国产无套粉嫩白浆在线 | 亚洲呦女专区 | 国产人成高清在线视频99最全资源 | 日本一区二区三区免费播放 | 香蕉久久久久久av成人 | 亚洲国产欧美国产综合一区 | 国产真人无遮挡作爱免费视频 | 免费国产黄网站在线观看 | av无码不卡在线观看免费 | 国产成人久久精品流白浆 | 国产精品久久久久无码av色戒 | 无码一区二区三区在线 | 中文字幕日产无线码一区 | 国产人妻精品一区二区三区不卡 | 国产人妖乱国产精品人妖 | 久久精品人人做人人综合试看 | 国产免费久久精品国产传媒 | 亚洲乱码中文字幕在线 | 沈阳熟女露脸对白视频 | 精品无码国产一区二区三区av | 国产成人无码区免费内射一片色欲 | 大色综合色综合网站 | 亚洲理论电影在线观看 | 亚洲热妇无码av在线播放 | 99久久亚洲精品无码毛片 | 亚洲精品无码国产 | 131美女爱做视频 | 精品国精品国产自在久国产87 | 亚洲午夜无码久久 | 丰满人妻精品国产99aⅴ | 老司机亚洲精品影院无码 | 国内综合精品午夜久久资源 | 好男人社区资源 | 人人妻人人藻人人爽欧美一区 | 精品国产一区二区三区四区在线看 | 色婷婷香蕉在线一区二区 | 大乳丰满人妻中文字幕日本 | 少妇性荡欲午夜性开放视频剧场 | 日本一区二区三区免费高清 | 欧美激情一区二区三区成人 | 1000部夫妻午夜免费 | 亚洲成a人片在线观看无码 | 人妻人人添人妻人人爱 | 中文字幕人妻无码一区二区三区 | 精品久久久中文字幕人妻 | 国产精品igao视频网 | 理论片87福利理论电影 | 高潮喷水的毛片 | 亚洲乱码中文字幕在线 | 亚洲中文字幕在线无码一区二区 | 色综合久久久无码网中文 | 亚洲午夜久久久影院 | 精品偷拍一区二区三区在线看 | 国产肉丝袜在线观看 | 国产精品久久久久久久9999 | 无码av中文字幕免费放 | 嫩b人妻精品一区二区三区 | 牲欲强的熟妇农村老妇女 | 国产无套粉嫩白浆在线 | 国产免费久久久久久无码 | 国产精品无码永久免费888 | 少妇激情av一区二区 | 日韩精品无码免费一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 久久综合色之久久综合 | 亚洲日本va午夜在线电影 | 日本一区二区三区免费高清 | 国产精品丝袜黑色高跟鞋 | 装睡被陌生人摸出水好爽 | 色 综合 欧美 亚洲 国产 | 亚洲午夜福利在线观看 | 一个人看的视频www在线 | 日韩精品无码一区二区中文字幕 | 色噜噜亚洲男人的天堂 | 激情爆乳一区二区三区 | 国产无套粉嫩白浆在线 | 亚洲欧美国产精品久久 | 免费国产黄网站在线观看 | 学生妹亚洲一区二区 | 亚洲精品一区国产 | 色综合久久中文娱乐网 | 亚洲 a v无 码免 费 成 人 a v | 久久久精品456亚洲影院 | 国产女主播喷水视频在线观看 | 亚洲七七久久桃花影院 | 九月婷婷人人澡人人添人人爽 | 性生交大片免费看女人按摩摩 | av香港经典三级级 在线 | 男女下面进入的视频免费午夜 | 最近的中文字幕在线看视频 | 日本大香伊一区二区三区 | 久久精品99久久香蕉国产色戒 | 国产莉萝无码av在线播放 | 天堂а√在线地址中文在线 | 玩弄人妻少妇500系列视频 | 国产亚洲tv在线观看 | 亚洲国精产品一二二线 | 国产性生交xxxxx无码 | 激情国产av做激情国产爱 | 亚洲国产精品毛片av不卡在线 | 精品国产国产综合精品 | 大屁股大乳丰满人妻 | 伊人色综合久久天天小片 | 日本精品少妇一区二区三区 | 中文字幕av伊人av无码av | 国内精品九九久久久精品 | www国产精品内射老师 | 内射后入在线观看一区 | 色 综合 欧美 亚洲 国产 | 成在人线av无码免观看麻豆 | 亚洲人成人无码网www国产 | 亚洲 高清 成人 动漫 | 国产精品福利视频导航 | 亚洲人成网站色7799 | 亚洲中文无码av永久不收费 | 亚洲第一无码av无码专区 | 亚洲 日韩 欧美 成人 在线观看 | 无码人妻少妇伦在线电影 | 国产综合久久久久鬼色 | a片免费视频在线观看 | 女人被爽到呻吟gif动态图视看 | 久久精品中文闷骚内射 | 久久综合激激的五月天 | 无套内谢的新婚少妇国语播放 | 高清不卡一区二区三区 | 性史性农村dvd毛片 | 性开放的女人aaa片 | 国产suv精品一区二区五 | 亚洲天堂2017无码中文 | 性色欲网站人妻丰满中文久久不卡 | 99久久99久久免费精品蜜桃 | 亚洲成av人片天堂网无码】 | 精品国产麻豆免费人成网站 | 无码午夜成人1000部免费视频 | 99视频精品全部免费免费观看 | 窝窝午夜理论片影院 | 国产熟女一区二区三区四区五区 | 精品乱码久久久久久久 | 一二三四社区在线中文视频 | 啦啦啦www在线观看免费视频 | 激情国产av做激情国产爱 | 精品无人区无码乱码毛片国产 | 成人性做爰aaa片免费看 | 久久久久免费看成人影片 | 强奷人妻日本中文字幕 | 国产成人综合在线女婷五月99播放 | 九九在线中文字幕无码 | 欧美自拍另类欧美综合图片区 | 免费观看又污又黄的网站 | 国产av无码专区亚洲awww | 久久无码中文字幕免费影院蜜桃 | 亚洲а∨天堂久久精品2021 | 国产婷婷色一区二区三区在线 | 国产偷抇久久精品a片69 | 国产精品多人p群无码 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产两女互慰高潮视频在线观看 | 亚洲人成网站免费播放 | 色婷婷av一区二区三区之红樱桃 | 国产女主播喷水视频在线观看 | 暴力强奷在线播放无码 | 国内少妇偷人精品视频免费 | 乱码午夜-极国产极内射 | 美女扒开屁股让男人桶 | 亚洲精品久久久久avwww潮水 | 成人性做爰aaa片免费看 | 欧美性生交活xxxxxdddd | 亚洲va欧美va天堂v国产综合 | 国产精品永久免费视频 | 久久久精品欧美一区二区免费 | 久久久久成人片免费观看蜜芽 | 久久久久久亚洲精品a片成人 | 亚洲一区av无码专区在线观看 | 国产三级精品三级男人的天堂 | 久久国内精品自在自线 | 激情综合激情五月俺也去 | 久久99精品国产麻豆蜜芽 | 亚洲无人区午夜福利码高清完整版 | 任你躁在线精品免费 | 欧美xxxxx精品 | 久久这里只有精品视频9 | 欧美人与动性行为视频 | 女人被男人躁得好爽免费视频 | 日韩在线不卡免费视频一区 | 捆绑白丝粉色jk震动捧喷白浆 | 一本色道久久综合亚洲精品不卡 | 最新国产麻豆aⅴ精品无码 | 人妻少妇精品久久 | 99久久精品无码一区二区毛片 | 99精品视频在线观看免费 | 性做久久久久久久免费看 | 日韩欧美群交p片內射中文 | 国产三级精品三级男人的天堂 | 日本护士毛茸茸高潮 | 亚洲综合色区中文字幕 | 正在播放东北夫妻内射 | 亚洲天堂2017无码 | 97精品国产97久久久久久免费 | 夜夜影院未满十八勿进 | 麻豆国产人妻欲求不满 | 俺去俺来也在线www色官网 | 久久99精品久久久久婷婷 | 一本加勒比波多野结衣 | 人人超人人超碰超国产 | 日本熟妇乱子伦xxxx | 亚洲国产欧美在线成人 | 午夜免费福利小电影 | 最新版天堂资源中文官网 | 波多野结衣 黑人 | 色综合久久网 | 国产精品美女久久久 | 黑人玩弄人妻中文在线 | 国产精品久久久久久亚洲毛片 | 亚洲精品国产精品乱码视色 | 97资源共享在线视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久综合狠狠综合久久综合88 | 亚洲乱码日产精品bd | 国精产品一区二区三区 | 国产一区二区三区四区五区加勒比 | 国产欧美熟妇另类久久久 | 精品国产一区av天美传媒 | 国精品人妻无码一区二区三区蜜柚 | 国产精品第一国产精品 | 国产精品视频免费播放 | 久久综合香蕉国产蜜臀av | 国产精品久久久久无码av色戒 | 亚洲日本va中文字幕 | 无码人妻少妇伦在线电影 | 亚洲 欧美 激情 小说 另类 | 色欲人妻aaaaaaa无码 | 日韩视频 中文字幕 视频一区 | 色综合久久88色综合天天 | 日本欧美一区二区三区乱码 | 无码任你躁久久久久久久 | 老子影院午夜伦不卡 | 真人与拘做受免费视频 | 黑人巨大精品欧美一区二区 | 两性色午夜免费视频 | 国产特级毛片aaaaaaa高清 | 欧美人妻一区二区三区 | 亚洲s色大片在线观看 | 精品一二三区久久aaa片 | 中文字幕乱码中文乱码51精品 | 免费男性肉肉影院 | 又色又爽又黄的美女裸体网站 | 亚洲午夜福利在线观看 | 99久久精品日本一区二区免费 | 日本护士毛茸茸高潮 | 中文字幕色婷婷在线视频 | 国产真实夫妇视频 | 精品国产精品久久一区免费式 | 无码成人精品区在线观看 | 强奷人妻日本中文字幕 | 欧美激情综合亚洲一二区 | 少妇厨房愉情理9仑片视频 | 日韩人妻少妇一区二区三区 | 久久久国产精品无码免费专区 | 久久精品人妻少妇一区二区三区 | 夜精品a片一区二区三区无码白浆 | 午夜无码区在线观看 | 国产激情艳情在线看视频 | 精品少妇爆乳无码av无码专区 | 国产精品igao视频网 | 人妻少妇精品视频专区 | 亚洲大尺度无码无码专区 | 初尝人妻少妇中文字幕 | 一本加勒比波多野结衣 | 又湿又紧又大又爽a视频国产 | 亚洲一区二区三区国产精华液 | 亚洲精品无码国产 | 人妻少妇精品无码专区二区 | 色噜噜亚洲男人的天堂 | 露脸叫床粗话东北少妇 | 图片区 小说区 区 亚洲五月 | 久久精品成人欧美大片 | 国产艳妇av在线观看果冻传媒 | 香港三级日本三级妇三级 | 玩弄少妇高潮ⅹxxxyw | 欧美黑人性暴力猛交喷水 | 2020久久超碰国产精品最新 | 一个人免费观看的www视频 | 300部国产真实乱 | 色综合久久久无码中文字幕 | 亚洲成色在线综合网站 | 成 人 免费观看网站 | 在线播放免费人成毛片乱码 | 国产一精品一av一免费 | 少妇人妻av毛片在线看 | 国产成人亚洲综合无码 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲欧美色中文字幕在线 | 中文字幕无码乱人伦 | 无码人妻精品一区二区三区不卡 | 娇妻被黑人粗大高潮白浆 | 日韩av无码中文无码电影 | 97久久超碰中文字幕 | 图片小说视频一区二区 | 丰满少妇人妻久久久久久 | 欧美日韩一区二区免费视频 | 人人妻人人澡人人爽欧美一区九九 | 久久婷婷五月综合色国产香蕉 | 久久久久成人精品免费播放动漫 | aa片在线观看视频在线播放 | 国产精品嫩草久久久久 | 欧美大屁股xxxxhd黑色 | 天天躁日日躁狠狠躁免费麻豆 | 一区二区传媒有限公司 | 久久综合九色综合欧美狠狠 | 国产综合久久久久鬼色 | 波多野结衣高清一区二区三区 | 精品少妇爆乳无码av无码专区 | 人人妻人人澡人人爽人人精品 | 99久久精品无码一区二区毛片 | 免费国产成人高清在线观看网站 | 成在人线av无码免费 | 亚洲成a人片在线观看无码3d | 欧美成人免费全部网站 | 亚洲 a v无 码免 费 成 人 a v | 在教室伦流澡到高潮hnp视频 | 国产人妖乱国产精品人妖 | 国产精品无码一区二区桃花视频 | 永久免费精品精品永久-夜色 | 老太婆性杂交欧美肥老太 | 欧美35页视频在线观看 | 久久人人爽人人人人片 | 国产人妻久久精品二区三区老狼 | 性色欲情网站iwww九文堂 | 青青草原综合久久大伊人精品 | 少妇无套内谢久久久久 | 亚洲国产欧美国产综合一区 | 无码av最新清无码专区吞精 | 日韩av无码一区二区三区 | 色综合久久久无码中文字幕 | 亚洲综合在线一区二区三区 | 亚洲日本va中文字幕 | 久久久久久九九精品久 | 国产av一区二区三区最新精品 | 人妻少妇精品无码专区二区 | 久久久精品成人免费观看 | 久久婷婷五月综合色国产香蕉 | 欧美日韩综合一区二区三区 | 2020久久香蕉国产线看观看 | 精品久久久久香蕉网 | 99久久精品午夜一区二区 | 日韩人妻少妇一区二区三区 | 四十如虎的丰满熟妇啪啪 | 青青青爽视频在线观看 | 亚洲人成影院在线无码按摩店 | 婷婷六月久久综合丁香 | 无码人妻丰满熟妇区五十路百度 | 亚洲 a v无 码免 费 成 人 a v | 国产精品人人爽人人做我的可爱 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产色精品久久人妻 | 欧美人与善在线com | 亚洲精品国产品国语在线观看 | 天干天干啦夜天干天2017 | 久久久www成人免费毛片 | 最近免费中文字幕中文高清百度 | 天堂亚洲免费视频 | 国内综合精品午夜久久资源 | 亚洲成av人在线观看网址 | 国产后入清纯学生妹 | 成人亚洲精品久久久久 | 久久99精品久久久久久 | 学生妹亚洲一区二区 | 爽爽影院免费观看 | 精品aⅴ一区二区三区 | 国产精品久久久久9999小说 | 久久精品国产亚洲精品 | 欧美人妻一区二区三区 | 成人性做爰aaa片免费看 | 伊人久久大香线焦av综合影院 | 成人三级无码视频在线观看 | 国产va免费精品观看 | 日日摸日日碰夜夜爽av | 亚洲男人av天堂午夜在 | 蜜桃视频插满18在线观看 | 荡女精品导航 | 国产偷自视频区视频 | 国产香蕉尹人综合在线观看 | 无码成人精品区在线观看 | 波多野结衣av在线观看 | 六月丁香婷婷色狠狠久久 | 伊人久久大香线蕉午夜 | 日本一卡2卡3卡四卡精品网站 | 亚洲精品无码国产 | 国精产品一品二品国精品69xx | a片免费视频在线观看 | 99精品视频在线观看免费 | 老头边吃奶边弄进去呻吟 | 国产两女互慰高潮视频在线观看 | 久久久精品国产sm最大网站 | 1000部夫妻午夜免费 | 国产真实乱对白精彩久久 | 久久久久久久人妻无码中文字幕爆 | 欧美人与禽zoz0性伦交 | a在线亚洲男人的天堂 | 欧美国产日产一区二区 | 99久久久无码国产aaa精品 | 国产精品无码一区二区桃花视频 | 久久综合九色综合欧美狠狠 | 成人欧美一区二区三区黑人 | 秋霞特色aa大片 | 久久久精品欧美一区二区免费 | 亚洲区欧美区综合区自拍区 | 日韩精品无码一区二区中文字幕 | 亚洲午夜无码久久 | 精品久久久久久人妻无码中文字幕 |