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

C++ Coder

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

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

本文摘自:http://blog.vckbase.com/teacheryang/archive/2005/06/27/8884.html

一、前言
  書接上回,話說在 doc(Word) 復(fù)合文件中,已經(jīng)解決了保存 xls(Excel) 數(shù)據(jù)的問題了。那么,接下來又要解決另一個問題:當 WORD 程序讀取復(fù)合文件,遇到了 xls 數(shù)據(jù)的時候,它該如何啟動 Excel 呢?啟動后,又如何讓 Excel 自己去讀入、解析、顯示 xls 數(shù)據(jù)呢?

二、CLSID 概念
  有一個非常簡單的解決方案,那就是在對象數(shù)據(jù)的前面,保存有處理這個數(shù)據(jù)的程序名。(見下圖左上)


圖一、CLSID 的概念
  這的確是一個簡單的方法,但同時問題也很嚴重。在“張三”的計算機上,Excel 的路徑是:"c:\office\Excel.exe",如果把這個 doc 文件復(fù)制到“李四”的計算機上使用,而“李四”的 Excel 的路徑是:
"d:\Program files\Microsoft Office\Office\Excel.exe",完蛋了:-(
  于是,微軟想出了一個解決方案,那就是不使用直接的路徑表示方法,而使用一個叫 CLSID(注1)的方式間接描述這些對象數(shù)據(jù)的處理程序路徑。CLSID 其實就是一個號碼,或者說是一個16字節(jié)的數(shù)。觀察注冊表(上圖),在HKCR\CLSID\{......}主鍵下,LocalServer32(DLL組件使用InprocServer32) 中保存著程序路徑名稱。CLSID 的結(jié)構(gòu)定義如下:
typedef struct _GUID {
  
DWORD Data1; // 隨機數(shù)
  WORD Data2; // 和時間相關(guān)
  WORD Data3; // 和時間相關(guān)
BYTE Data4[8]; // 和網(wǎng)卡MAC相關(guān)
} 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}

  用一個號碼間接表示程序名,的確是個 Good idea,實現(xiàn)了組件位置的透明性,并方便地擴展出 DCOM(遠程組件)。但,但,但,但.....CLSID 有16個字節(jié)共128位二進制數(shù),干嗎用這么長的數(shù)字呀?遙想當年......我還在上幼兒園的時候,人們設(shè)計了 socket,用 TCP/IP 協(xié)議進行網(wǎng)絡(luò)通訊。每個參與通訊的計算機都有一個4字節(jié)的 IP 表示編號地址,范圍是 0,0,0,0 ~ 255,255,255,255 共42億個地址??墒菦]想到啊,沒想到,自從 Internet 選擇了TCP/IP 協(xié)議后,42億個地址就不夠全世界的勞動人民分配啦。除了勞動人民,還有冰箱、彩電、電飯鍋、手機、手提電腦......這些都需要連網(wǎng)呀。在辦公室通過網(wǎng)絡(luò)開啟電飯鍋給我燜飯,下班回家后就能吃現(xiàn)成的啦,多幸福呀??。ㄗⅲ涸谖覀兗依掀攀穷I(lǐng)導(dǎo),所以是我做飯???.....)
  由于前車之鑒,微軟這次設(shè)計 CLSID/IID 就使用了GUID概念的16個字節(jié),這下好啦,全世界60億人口,每個人每秒鐘分配10億個號碼,那么需要分配1800億年。反正等到地球沒有了都不會使用完的:-)

三、產(chǎn)生 CLSID
  
1、
如果使用開發(fā)環(huán)境編寫組件程序,則IDE會自動幫你產(chǎn)生 CLSID;
  2、
你可以手工寫 CLSID,但千萬不要和人家已經(jīng)生成的 CLSID 重復(fù)呀,所以嚴重地不推薦;(可是微軟的CLSID都是手工寫的,這叫“只許州官放火,不許百姓點燈”) ;
  3、
程序中,可以用函數(shù) CoCreateGuid() 產(chǎn)生 CLSID;
  4、
使用工具產(chǎn)生 GUID(注2);

  vc6.0版本運行:"vc目錄\Common\Tools\GuidGen.exe"程序(你可以參照上回文章中介紹的方法,把這個工具程序加到開發(fā)環(huán)境中,方便調(diào)用)。vc.net版本,在菜單“工具\創(chuàng)建GUID”中,就可以執(zhí)行了。

四、ProgID 概念
  每一個COM組件都需要指定一個 CLSID,并且不能重名。它之所以使用16個字節(jié),就是要從概率上保證重復(fù)是“不可能”的。但是,(世界上就怕“但是”二字)微軟為了使用方便,也支持另一個字符串名稱方式,叫 ProgID(注3)。見上圖注冊表的ProgID 子鍵內(nèi)容(注4)。由于 CLSID 和 ProgID 其實是一個概念的兩個不同的表示形式,所以我們在程序中可以隨便使用任何一種。(有些人就是討厭,說話不算數(shù)。明明 GUID 的目的就是禁止重復(fù),但居然又允許使用 ProgID?!ProgID 是一個字符串的名字,重復(fù)的可能性就太大了呀。趕明兒我也寫個程序,我打算這個程序的 ProgID 叫“Excel.Application”,嘿嘿)下面介紹一下 CLSID 和 ProgID 之間的轉(zhuǎn)換方法和相關(guān)的函數(shù):

函數(shù) 功能說明
CLSIDFromProgID()、CLSIDFromProgIDEx() 由 ProgID 得到 CLSID。沒什么好說的,你自己都可以寫,查注冊表貝
ProgIDFromCLSID() 由 CLSID 得到 ProgID,調(diào)用者使用完成后要釋放 ProgID 的內(nèi)存(注5)
CoCreateGuid() 隨機生成一個 GUID
IsEqualGUID()、IsEqualCLSID()、IsEqualIID() 比較2個ID是否相等
StringFromCLSID()、StringFromGUID2()、StringFromIID() 由 CLSID,IID 得到注冊表中CLSID樣式的字符串,注意釋放內(nèi)存

 

五、接口(Interface)的來歷
  到此,我們已經(jīng)知道了 CLSID 或 ProgID 唯一地表示一個組件服務(wù)程序,那么根據(jù)這些ID,就可以加載運行組件,并為客戶端程序提供服務(wù)了。(啟動組件程序的方法,會陸續(xù)介紹)。接下來先討論如何調(diào)用組件提供的函數(shù)?-----接口。
  作為客戶端程序員,它希望或者說他要求:我的程序只寫一次,然后不做任何修改就可以調(diào)用任意一個組件。舉例來說:

  1. 你可以在 Word 中嵌入 Excel,也可以嵌入 Picture,也可以嵌入任何第三方發(fā)表的 ActiveX 文檔......也就是說,連 Word 自己都不知道使用它的人將會在 doc 里面插入什么東東;

  2. 你可以在 HTML 文件中插入一個 ActiveX,也可以插入一個程序腳本Script,......你自己寫的插件也可以插入到 IE 環(huán)境中。為了完成你的功能, 你絕對也不會去讓微軟修改IE吧?!

 

  這個要求實在有點難度,Office 開發(fā)停滯了。說來話巧,一天老O(Office 項目的總工程師)和小B(VB 項目的總工程師)一起喝酒,老O向小B傾訴了他的煩惱:
老O:怎么能讓我寫的程序C,可以調(diào)用其它人寫的程序S中的函數(shù)?(C表示客戶程序,S表示提供服務(wù)的程序)
小B:你是不是喝糊涂了?讓S作成 DLL,你去 LoadLibrary()、GetProcAddress()、...FreeLibrary()?!
老O:廢話!要是這么簡單就好了。問題是,連我都不知道這個S程序是干什么的?能干什么?我怎么調(diào)用呀?
小B:哦......這個比較高級,但我現(xiàn)在不能告訴你,因為我怕你印象不深。
老O:~!·#¥%……—*......
小B:是這樣的,在VB中,我們制定了一個標準,這個標準允許任何一個VB開發(fā)者,把他自己寫的某個功能的小程序放在VB的工具欄上,這樣就好象他擴展了 VB 的功能一樣。
老O:哦?就是那個叫什么 VBX 的濫玩意兒?
小B:我呸......別看 VBX 這個東西不起眼兒,的確我也沒看上它。但你猜怎么著?現(xiàn)在有成千上萬的 VB 程序愛好者把他們寫的各式各樣功能的 VBX 小程序,放到網(wǎng)上,讓大家共享那。
老O:哦~~~,那你們的這個 VBX 標準是什么?
小B:嘿嘿......其實特簡單,就是在 VBX 中必須實現(xiàn)7個函數(shù),這7個函數(shù)名稱和功能必須是:初始化、釋放、顯示、消息處理......,而至于它內(nèi)部想干什么,我也管不著。我只是在需要的時候調(diào)用我需要的這7個函數(shù)。
老O:哦~~~,這樣呀......對了,我現(xiàn)有個急事,我先走了。88,你付帳吧......
小B:喂!喂喂...... 走這么急干什么,錢包都掉了:-)
  老O雖然丟了錢包,仍然興奮地沖回辦公室,他開始了思考......

1、我的程序C,要能調(diào)用任何人寫的程序B。那么B必須要按照我事先的要求,提供我需要的函數(shù)F1(),F2(),F3(),K1(),K2()。
2、BASIC 是解釋執(zhí)行,因此它的函數(shù)不用考慮書寫順序,只要給出函數(shù)名,解釋器就能找到。但我使用的是 C++呀......
3、C++編譯后的代碼中沒有函數(shù)名,只有函數(shù)地址,因此我必須改進為用VTAB(虛函數(shù)表)表示函數(shù)入口:


圖二、VTAB 的結(jié)構(gòu)

4、還不夠好,需要改進一下,因為所有的函數(shù)地址都放在一個表中會不靈活、不好修改、不易擴展。恩,有了!按照函數(shù)功能的類型進行分類:


圖三、多個 VTAB 的結(jié)構(gòu)

5、問題又來了,現(xiàn)在有2個 VTAB 虛函數(shù)表,那么怎么能夠從一個表找到另一個表那?恩又有辦法了,我要求你必須要實現(xiàn)一個函數(shù),并且這個函數(shù)地址必須放在所有表的開頭(表中的第一個函數(shù)指針),這個函數(shù)就叫 QueryInterface()吧,完成從一個表查找到另一個表的功能:(除了QueryInterface()函數(shù),順便也完成另外兩個函數(shù),叫 AddRef() 和 Release()。這兩個函數(shù)的功能以后再說)


圖四、COM 接口結(jié)構(gòu)

6、為了以后描述方便,不再使用上圖(圖四)的方法了,而使用圖五這樣簡潔的樣式:


圖五、COM 接口結(jié)構(gòu)的簡潔圖示


六、接口(Interface)概念
1、函數(shù)是通過 VTAB 虛函數(shù)表提供其地址, 從另一個角度來看,不管用什么語言開發(fā),編譯器產(chǎn)生的代碼都能生成這個表。這樣就實現(xiàn)了組件的“二進制特性”輕松實現(xiàn)了組件的跨語言要求。

2、假設(shè)有一個指針型變量保存著 VTAB 的首地址,則這個變量就叫“接口指針”(注6), 變量命名的時候,習(xí)慣上加上"I"開頭。另外為了區(qū)分不同的接口,每個接口 也都要有一個名字,該名字就和 CLSID 一樣,使用 GUID 方式,叫 IID。
3、接口一經(jīng)發(fā)表,就不能再修改了。不然就會出現(xiàn)向前兼容的問題。這個性質(zhì)叫“接口不變性”。
4、組件中必須有3個函數(shù),QueryInterface、AddRef、Release,它們3個函數(shù)也組成一個接口,叫"IUnknown"。(注7)
5、任何接口,其實都包含了 IUnknown 接口。隨著你接觸到更多的接口就會了更體會解到接口的另一個性質(zhì)“繼承性”。
6、在任何接口上,調(diào)用表中的第一個函數(shù),其實就是調(diào)用 QueryInterface()函數(shù),就得到你想要的另外一個接口指針。這個性質(zhì)叫“接口的傳遞性”
7、C/C++語言中需要事先對函數(shù)聲明,那么就 會要求組件也必須提供C語言的頭文件。不行!為了能使COM具有跨語言的能力,決定不再為任何語言提供對應(yīng)的函數(shù)接口聲明,而是獨立地提供一個叫類型庫(TLB)的聲明。每個語言的IDE環(huán)境自己去根據(jù)TLB生成自己語言需要的包裝。這個性質(zhì)叫“接口聲明的獨立性”(注8)

七、客戶程序與組件之間的協(xié)商調(diào)用
  
回到我們的上一個話題,Word中嵌入一個組件,那么Word是如何協(xié)商使用這個組件的那?下面是容器和組件之間的一個模擬對話過程:

  容器 協(xié)商部分 組件 應(yīng)答部分
1 根據(jù)CLSID啟動組件 。
CoCreateInstance()
生成對象,執(zhí)行構(gòu)造函數(shù),執(zhí)行初始化動作。
2 你有IUnknown接口嗎? 有,給你!
3 恩,太好了,那么你有IPersistStorage接口嗎?(注9)
IUnknown::QueryInterface(IID_IPersistStorage...)
沒有!
4 真差勁,連這個都沒有。那你有IPersistStreamInit接口嗎?(注10)
IUnknown::QueryInterface(IID_IPersistStreamInit...)
哈,這個有,給!
5 好,好,這還差不多。你現(xiàn)在給我初始化吧。
IPersistStreamInit::InitNew()
OK,初始化完成了。
6 完成了?好!現(xiàn)在你讀數(shù)據(jù)去吧。
IPersistStreamInit::Load()
讀完啦。我根據(jù)數(shù)據(jù),已經(jīng)在窗口中顯示出來了。
7 好,現(xiàn)在咱們各自處理用戶的鼠標、鍵盤消息吧...... ......
8 哎呀!用戶要保存退出程序了。你的數(shù)據(jù)被用戶修改了嗎?
IPersistStreamInit::IsDirty()
改了,用戶已經(jīng)修改啦。
9 那好,那么用戶修改后,你的數(shù)據(jù)需要多大的存儲空間呀?
IPersistStreamInit::GetSizeMax()
恩,我算算呀......好了,總共需要500KB。
10 暈,你這么個小玩意居然占用這么大空間?!......好了,你可以存了。
IPersistStreamInit::Save()
謝謝,我已經(jīng)存好了。
11 恩。拜拜了您那。(注11)
IPersistStreamInit::Release();IUnknown::Release()
執(zhí)行析構(gòu)函數(shù),刪除對象。
12 我自己也該退出了......
PostQuitMessage()
 

  容器(或者說客戶端)就是這樣和組件進行對話,協(xié)商調(diào)用的。如果組件甲實現(xiàn)了 IA 接口,那么容器就會使用它,如果組件乙沒有提供 IA 接口,但是它提供了 IB 接口,那么容器就會調(diào)用 IB 接口的函數(shù)......如此,容器程序根本就不需要知道組件到底是干什么的,組件到底是用什么語言開發(fā)的,組件的磁盤位置到底在哪里,它都可以正常運行。太奇妙了!太精彩了!怎一個“爽”字了得!

八、小結(jié)
  第二回中,介紹了兩個非常重要的概念:CLSID 和 Interface。由于全篇都是概念描述而沒有示例程序相配合,可能讀者的理解還不太深入、不徹底。別著急,我們馬上就要進入到組件程序設(shè)計階段了,到那個時候,你根據(jù)具體的程序代碼,再回過頭來再次閱讀本回文章,沒讀懂?哦......再讀!慢慢地您老人家就懂了:-)

留作業(yè)啦......
1、IDispatch 接口的 IID 是多少?(哎~~~ 笨笨,在源程序中,用鼠標右鍵執(zhí)行Go to definition 呀)
2、IPicture 接口有幾個函數(shù)?功能是什么?(別玩了!你多大了?想不想在程序中顯示 JPG 圖像呀,看 MSDN 去)
  想知道為什么COM函數(shù)總是返回 HRESULT 嗎?想知道如何使用 BSTR、VARIANT 嗎?想知道 COM 中應(yīng)該如何使用內(nèi)存嗎?想知道如何使用 UNICODE 嗎?......恩~~~,我現(xiàn)在不能告訴你,我現(xiàn)在告訴你,怕你印象不深!且聽下回分解......

 


 

注1:CLSID = Class ID 上回書已經(jīng)介紹了把CLSID寫入復(fù)合文件的函數(shù):WriteClassStg()、IStorage::SetClass()。
注2:GUID 全局唯一標示符,CLSID/IID 其實是借用了GUID的概念。
注3:ProgID = Program ID,等價于 CLSID, 是用字符串表示的。
注4:注冊表子鍵 ProgID 和 VersionIndependentProgID 分別表示真正的 ProgID 和版本無關(guān)的 ProgID。比如在我計算機上安裝的 Excel,它的 ProgID = "Excel.Application.9",而 VersionIndependentProgID = "Excel.Application"。
注5:COM 組件的內(nèi)存管理,見后續(xù)的文章。
注6:Interface = 接口,以前微軟不叫它接口,而叫協(xié)議Protocol。其實我 到認為這個詞更貼切一些。
注7:IUnknown 這個名字起的好,居然叫“我不知道”:-),它的 IID 叫 IID_IUnknown,如果用注冊表樣式表示,那么它的值是{00000000-0000-0000-C000-000000000046}。
注8:TLB是由一個描述接口的文件 IDL 經(jīng)過編譯產(chǎn)生的。IDL 的說明,見后續(xù)的文章吧。
注9:IPersistStorage 是用復(fù)合文件的存儲(Storage)功能來保存/讀取數(shù)據(jù)用的一個接口。
注10:IPersistStreamInit 是用復(fù)合文件的流(Stream)功能來保存/讀取數(shù)據(jù)用的一個接口。
注11:拜拜了您那 = 英語北京話,再見。

posted on 2012-10-17 22:33 jackdong 閱讀(505) 評論(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>
            欧美日韩第一页| 亚洲一区视频| 99人久久精品视频最新地址| 欧美高清一区| 欧美福利专区| 亚洲激情成人在线| 欧美插天视频在线播放| 欧美成人黄色小视频| 久久精品亚洲国产奇米99| 久久国产精品高清| 久久精品国产亚洲aⅴ| 久久精品最新地址| 玖玖玖国产精品| 亚洲欧洲精品一区二区三区不卡 | 中文一区二区| 亚洲影院污污.| 久久九九热免费视频| 久久天堂成人| 欧美日韩国产精品| 国产精品入口麻豆原神| 黄色成人在线| 亚洲一区区二区| 欧美岛国在线观看| 亚洲天天影视| 久久久久国产一区二区三区四区| 免费一区二区三区| 国产精品腿扒开做爽爽爽挤奶网站| 国产在线观看精品一区二区三区| 亚洲免费av电影| 久久精品1区| 亚洲人成绝费网站色www| 午夜激情综合网| 欧美日韩三级一区二区| 亚洲第一区在线| 久久精品国产v日韩v亚洲| 久久精品噜噜噜成人av农村| 亚洲欧美激情视频| 亚洲国产成人精品女人久久久| 亚洲网站视频| 欧美精品成人在线| 怡红院av一区二区三区| 西瓜成人精品人成网站| 亚洲日本va在线观看| 久久精品国产亚洲5555| 国产精品久久久久毛片软件 | 国产欧美一区二区三区另类精品| 亚洲国产美国国产综合一区二区| 午夜精彩视频在线观看不卡 | 亚洲精品孕妇| 久久婷婷国产综合精品青草 | 欧美日本精品| 亚洲福利视频免费观看| 久久久久亚洲综合| 亚洲欧美激情诱惑| 国产精品视频自拍| 亚洲综合久久久久| 亚洲精品资源| 国产午夜精品美女毛片视频| 日韩视频永久免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 午夜免费在线观看精品视频| 欧美日韩国产美| 99国产精品| 亚洲三级观看| 欧美日韩视频一区二区三区| 欧美jizz19性欧美| 亚洲欧洲日本国产| 亚洲第一天堂av| 欧美不卡在线| 99re66热这里只有精品4| 91久久精品一区二区三区| 欧美华人在线视频| 中文在线资源观看视频网站免费不卡| 亚洲精品极品| 国产精品福利在线观看| 欧美在线观看一区二区三区| 欧美一区高清| 91久久精品www人人做人人爽| 亚洲国产精品123| 欧美日韩一区二区三区四区五区| 亚洲尤物在线视频观看| 欧美亚洲综合网| 韩日精品中文字幕| 亚洲大片免费看| 欧美日韩中文字幕在线视频| 小黄鸭视频精品导航| 欧美中文在线观看国产| 1000部精品久久久久久久久| 亚洲国产天堂久久综合| 国产精品免费区二区三区观看| 久久福利一区| 欧美激情视频在线播放 | 国产精品久久二区| 欧美在线视频一区| 久久综合狠狠综合久久激情| 一区二区三区 在线观看视频| 亚洲综合欧美| 亚洲美女性视频| 欧美在线视频免费观看| 一本久久综合亚洲鲁鲁| 欧美一区二区三区免费观看视频| 亚洲日本欧美| 欧美一区二区三区啪啪| 一本色道久久综合亚洲精品按摩 | 亚洲在线视频一区| 久久福利一区| 这里是久久伊人| 欧美有码在线观看视频| 裸体一区二区三区| 欧美日韩午夜| 美女精品自拍一二三四| 国产精品久久久久9999吃药| 欧美激情精品久久久| 国产精品揄拍500视频| 亚洲人成人99网站| 黄色日韩在线| 亚洲欧美激情视频在线观看一区二区三区 | 国产精品永久免费在线| 亚洲二区在线视频| 国产一区二区成人| 中文有码久久| 一区二区三区www| 美女视频一区免费观看| 久久黄色小说| 国产毛片精品国产一区二区三区| 99ri日韩精品视频| 日韩一二三区视频| 欧美成人一区二区| 欧美成人免费播放| 狠狠入ady亚洲精品| 亚洲男人第一网站| 亚洲一级免费视频| 欧美日韩一区二区三区高清| 亚洲人体大胆视频| 99re成人精品视频| 欧美日韩国产影片| 亚洲精品中文字幕在线| 99国产精品久久久久久久| 欧美成人精品激情在线观看| 欧美高清视频| 99国内精品久久| 欧美日韩亚洲网| 亚洲免费不卡| 亚洲免费一在线| 亚洲女性裸体视频| 久久亚洲免费| 一区二区三区在线视频观看| 久久精品在线免费观看| 嫩草影视亚洲| 亚洲伦理精品| 国产精品成人一区二区| 亚洲自拍偷拍福利| 久久人91精品久久久久久不卡| 狠狠综合久久| 欧美成人亚洲| 亚洲一区免费| 久久香蕉精品| 亚洲美女中出| 国产精品一区免费在线观看| 久久av一区| 亚洲国产精品成人| 亚洲一区成人| 国内精品久久久久影院薰衣草| 久久字幕精品一区| 99精品欧美| 久久一区亚洲| 亚洲视频狠狠| 黄网站色欧美视频| 欧美日韩精品免费观看视频| 亚洲欧美日韩第一区| 久色婷婷小香蕉久久| 一区二区av在线| 国内精品**久久毛片app| 在线日韩av| 亚洲裸体在线观看| 欧美一级专区免费大片| 亚洲高清不卡在线观看| 国产精品劲爆视频| 美女国内精品自产拍在线播放| 一本久道久久久| 欧美成人精品一区二区三区| 亚洲欧美日本在线| 亚洲欧洲久久| 激情偷拍久久| 国产精品欧美精品| 欧美福利视频网站| 久久精品视频99| 亚洲综合成人在线| 亚洲精品之草原avav久久| 毛片一区二区| 香蕉久久国产| 99精品欧美| 亚洲激情在线| 狠狠色丁香婷婷综合| 国产精品免费看久久久香蕉| 国产九九精品| 亚洲欧美成人在线| 亚洲视频在线观看| 亚洲黄一区二区| 欧美成人午夜视频|