• <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>

            把握命運(yùn),追逐夢(mèng)想

            對(duì)自己所做的事要有興趣,同時(shí)還要能夠堅(jiān)持不懈

            統(tǒng)計(jì)

            留言簿(1)

            閱讀排行榜

            評(píng)論排行榜

            2011年4月22日 #

            VC 2008 sp1 中 deque的erase函數(shù)的問(wèn)題

            該函數(shù)在erase一個(gè)元素的時(shí)候,先復(fù)制最近端,例如該元素靠近前端,那么該元素之前的所有元素被復(fù)制,并后移拷貝,達(dá)到覆蓋該元素的效果,導(dǎo)致最后Destroy的是第一個(gè)元素,析構(gòu)函數(shù)也是第一個(gè)元素的,由于第一個(gè)元素被復(fù)制了,所以第一個(gè)元素如果沒(méi)有拷貝復(fù)制函數(shù)來(lái)處理指針變量的話,那么之后第一個(gè)元素的副本中的指針將是錯(cuò)誤的,而且同時(shí)有一個(gè)問(wèn)題,我們想要destroy的那個(gè)元素的析構(gòu)函數(shù)沒(méi)被調(diào)用。

            posted @ 2011-04-22 09:02 把握命運(yùn) 閱讀(631) | 評(píng)論 (2)編輯 收藏

            2009年8月24日 #

            def文件一個(gè)比較詳細(xì)的例子

            先看看EXPORTS語(yǔ)法規(guī)則:
            entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]

            對(duì)上面語(yǔ)法的解釋:
            1、

            entryname 是要導(dǎo)出的函數(shù)名或變量名。這是必選項(xiàng)。如果導(dǎo)出的名稱與 DLL 中的名稱不同,則通過(guò) internalname 指定 DLL 中導(dǎo)出的名稱。例如,如果 DLL 導(dǎo)出函數(shù) func1(),要將它用作 func2(),則應(yīng)指定:

            EXPORTS
            func2=func1

            2、

            @ordinal 允許指定是序號(hào)而不是函數(shù)名將進(jìn)入 DLL 的導(dǎo)出表。這有助于最小化 DLL 的大小。.LIB 文件將包含序號(hào)與函數(shù)之間的映射,這使您得以像通常在使用 DLL 的項(xiàng)目中那樣使用函數(shù)名。

            可選的 NONAME 關(guān)鍵字允許只按序號(hào)導(dǎo)出,并減小結(jié)果 DLL 中導(dǎo)出表的大小。但是,如果要在 DLL 上使用 GetProcAddress,則必須知道序號(hào),因?yàn)槊Q將無(wú)效。

            可選的 PRIVATE 關(guān)鍵字禁止將 entryname 放到由 LINK 生成的導(dǎo)入庫(kù)中。它對(duì)同樣是由 LINK 生成的圖像中的導(dǎo)出無(wú)效。

            可選的 DATA 關(guān)鍵字指定導(dǎo)出的是數(shù)據(jù),而不是代碼。例如,可以導(dǎo)出數(shù)據(jù)變量:

            EXPORTS
            i DATA

            當(dāng)對(duì)同一導(dǎo)出使用 PRIVATEDATA 時(shí),PRIVATE 必須位于 DATA 的前面。

            3、

            有三種導(dǎo)出定義的方法,按照建議的使用順序依次為:

            1. 源代碼中的 __declspec(dllexport) 關(guān)鍵字

            2. .def 文件中的 EXPORTS 語(yǔ)句

            3. LINK 命令中的 /EXPORT 規(guī)范

            所有這三種方法可以用在同一個(gè)程序中。LINK 在生成包含導(dǎo)出的程序時(shí)還創(chuàng)建導(dǎo)入庫(kù),除非生成中使用了 .exp 文件。


            4、一個(gè)詳細(xì)的
            EXPORTS
            DllCanUnloadNow      @1     PRIVATE   DATA
            DllWindowName = Name        DATA
            DllGetClassObject    @4 NONAME   PRIVATE
            DllRegisterServer    @7
            DllUnregisterServer
            注意,使用 .def 文件從 DLL 中導(dǎo)出變量時(shí),不需要在變量上指定 __declspec(dllexport)。但是,在任何使用 DLL 的文件中,仍必須在數(shù)據(jù)聲明上使用 __declspec(dllimport)
             
            下面的是一個(gè)例子,可以看到def文件實(shí)際上的作用。











            Node_t node;

            BOOL APIENTRY DllMain( HMODULE hModule,
                                   DWORD  ul_reason_for_call,
                                   LPVOID lpReserved
                                 )
            {
                node.x 
            = 5;
                node.y 
            = 6;
                
            return TRUE;
            }



            int Max(int x, int y)
            {
                
            if(x>=y)
                    
            return x;
                
            else
                    
            return y;
            }


            int Min(int x, int y)
            {
                
            if(x>=y)
                    
            return y;
                
            else
                    
            return x;
            }


            Node_t 
            * func1()
            {
                
            return &node;
            }


            Node_t 
            * func2()
            {
                
            return &node;
            }

            下面是def文件


            EXPORTS
            Max            
            =Max    @2
            MinChange    
            =Min    @1
            func1        
            =func1    @3    NONAME 
            func2        
            =func2    @5    PRIVATE 
            node        
            =node    @8    PRIVATE        

            下面是對(duì)應(yīng)的lib的導(dǎo)出

             2    ?Max@@YAHHH@Z (int __cdecl Max(int,int))
             
            1    ?MinChange@@YAHHH@Z (int __cdecl MinChange(int,int))
             
            3    ?func1@@YAPAUNode_t@@XZ (struct Node_t * __cdecl func1(void))

            下面是對(duì)應(yīng)的dll文件的導(dǎo)出

                ordinal hint RVA      name

                      
            2    0 00001020 Max = ?Max@@YAHHH@Z (int __cdecl Max(int,int))
                      
            1    1 00001030 MinChange = ?Min@@YAHHH@Z (int __cdecl Min(int,int))
                      
            5    2 00001040 func2 = ?func1@@YAPAUNode_t@@XZ (struct Node_t * __cdecl func1(void))
                      
            8    3 00003348 node = ?node@@3UNode_t@@A (struct Node_t node)
                      
            3      00001040 [NONAME] ?func1@@YAPAUNode_t@@XZ (struct Node_t * __cdecl func1(void))

            從上面可以看出來(lái),def文件的符號(hào)在lib中的作用并不大,但是函數(shù)名稱,比如?MinChange@@YAHHH@Z中的MinChange是因?yàn)閐ef中把Min改成了MinChange,所以lib中也進(jìn)行了修改,但是這個(gè)MinChange符號(hào)實(shí)際上出現(xiàn)在dll文件的name列中。其實(shí)這也看出來(lái)了,def文件只是在loadlibrary這種運(yùn)行時(shí)加載有效。
            由于lib中的函數(shù)名變成了?MinChange@@YAHHH@Z,導(dǎo)致使用__declspec(dllimport)進(jìn)行導(dǎo)入的啟動(dòng)時(shí)加載,生成的?Min@@YAHHH@Z無(wú)法與?MinChange@@YAHHH@Z對(duì)應(yīng),而出現(xiàn)鏈接時(shí)的錯(cuò)誤。所以不應(yīng)該改變函數(shù)名,而應(yīng)該在def文件中直接使用函數(shù)名,這樣啟動(dòng)時(shí)加載和運(yùn)行時(shí)加載都能夠順利進(jìn)行。
            同時(shí)從上面也可以看出NONAME和PRIVATE的作用的。
            問(wèn)題:試驗(yàn)中使用DATA總是出錯(cuò),不知道怎么弄。














            posted @ 2009-08-24 10:29 把握命運(yùn) 閱讀(15763) | 評(píng)論 (1)編輯 收藏

            WSAStartup簡(jiǎn)單解釋

            int WSAStartup (
              WORD
            wVersionRequested
              LPWSADATA lpWSAData 
            );
            第一個(gè)參數(shù)是調(diào)用者能夠使用的最高版本號(hào)。
            第二個(gè)參數(shù)中的前兩個(gè)成員中,第一個(gè)成員是sock dll返回的版本號(hào),第二個(gè)參數(shù)是dll支持的最高版本號(hào)。

            這個(gè)函數(shù)成功返回的條件是,第一個(gè)參數(shù)的版本號(hào)高于sock dll能夠支持的最低版本,那么就表示dll肯定支持調(diào)用者能夠使用的一個(gè)版本。在第二個(gè)參數(shù)中的第一個(gè)變量種返回第一個(gè)參數(shù)和dll支持的最高版本中的那個(gè)小的版本。
            示例圖,有重疊,說(shuō)明存在可以使用的版本。

            第一行是調(diào)用者能夠使用的所有版本,第二行是dll支持的所有版本,而這個(gè)函數(shù)中的第一個(gè)參數(shù)是第一行中的最大版本。第二個(gè)參數(shù)中的第一個(gè)成員是重疊部分的最大的那個(gè)。如果沒(méi)有重疊部分,那么函數(shù)失敗。

            posted @ 2009-08-24 09:51 把握命運(yùn) 閱讀(319) | 評(píng)論 (0)編輯 收藏

            2009年8月23日 #

            線程同步的幾種方法

            1.CreateMutex
               WaitForSingleObject
               RealseMutex

            2.CreateThread中的臨界區(qū)

            posted @ 2009-08-23 20:30 把握命運(yùn) 閱讀(255) | 評(píng)論 (0)編輯 收藏

            2009年8月20日 #

            istream_iterator的自增

             

              // TEMPLATE CLASS istream_iterator
            template<class _Ty,
             class _Elem = char,
             class _Traits = char_traits<_Elem>,
             class _Diff = ptrdiff_t>
             class istream_iterator
              : public iterator<input_iterator_tag, _Ty, _Diff,
               const _Ty *, const _Ty&>
             { // wrap _Ty extracts from input stream as input iterator
             typedef istream_iterator<_Ty, _Elem, _Traits, _Diff> _Myt;
            public:
             typedef _Elem char_type;
             typedef _Traits traits_type;
             typedef basic_istream<_Elem, _Traits> istream_type;

            #if _SECURE_SCL
             typedef _Range_checked_iterator_tag _Checked_iterator_category;
            #endif

             istream_iterator()
              : _Myistr(0)
              { // construct singular iterator
              }

             istream_iterator(istream_type& _Istr)
              : _Myistr(&_Istr)
              { // construct with input stream
              _Getval();
              }

             const _Ty& operator*() const
              { // return designated value

             #if _HAS_ITERATOR_DEBUGGING
              if (_Myistr == 0)
               {
               _DEBUG_ERROR("istream_iterator is not dereferencable");
               _SCL_SECURE_OUT_OF_RANGE;
               }
             #else
              _SCL_SECURE_VALIDATE_RANGE(_Myistr != 0);
             #endif /* _HAS_ITERATOR_DEBUGGING */

              return (_Myval);
              }

             const _Ty *operator->() const
              { // return pointer to class object
              return (&**this);
              }

             _Myt& operator++()
              { // preincrement

             #if _HAS_ITERATOR_DEBUGGING
              if (_Myistr == 0)
               {
               _DEBUG_ERROR("istream_iterator is not incrementable");
               _SCL_SECURE_OUT_OF_RANGE;
               }
             #else
              _SCL_SECURE_VALIDATE_RANGE(_Myistr != 0);
             #endif /* _HAS_ITERATOR_DEBUGGING */

              _Getval();
              return (*this);
              }

             _Myt operator++(int)
              { // postincrement
              _Myt _Tmp = *this;
              ++*this;
              return (_Tmp);
              }

             bool _Equal(const _Myt& _Right) const
              { // test for iterator equality
              return (_Myistr == _Right._Myistr);
              }

            protected:
             void _Getval()
              { // get a _Ty value if possible
              if (_Myistr != 0 && !(*_Myistr >> _Myval))
               _Myistr = 0;
              }

             static void _Xran()
              { // report an out_of_range error
              _THROW(out_of_range, "invalid istream_iterator");
              }

             istream_type *_Myistr; // pointer to input stream
             _Ty _Myval; // lookahead value (valid if _Myistr is not null)
             };

              // istream_iterator TEMPLATE OPERATORS
            template<class _Ty,
             class _Elem,
             class _Traits,
             class _Diff> inline
             bool operator==(
              const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Left,
              const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Right)
             { // test for istream_iterator equality
             return (_Left._Equal(_Right));
             }

            template<class _Ty,
             class _Elem,
             class _Traits,
             class _Diff> inline
             bool operator!=(
              const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Left,
              const istream_iterator<_Ty, _Elem, _Traits, _Diff>& _Right)
             { // test for istream_iterator inequality
             return (!(_Left == _Right));
             }

            紅色部分就是重點(diǎn)了,其實(shí)這種迭代器不能自增,只是不斷把流中的元素放到自己所存的值里,當(dāng)?shù)竭_(dá)流末尾時(shí),直接將判斷指針設(shè)為0。

            posted @ 2009-08-20 12:45 把握命運(yùn) 閱讀(993) | 評(píng)論 (0)編輯 收藏

            C++練習(xí)5作業(yè)

                 摘要: //train.h#pragma once#include"stdafx.h"class Train{public:    Train(int seatNum);    virtual ~Train(void);    bool ...  閱讀全文

            posted @ 2009-08-20 12:05 把握命運(yùn) 閱讀(260) | 評(píng)論 (0)編輯 收藏

            2009年8月19日 #

            關(guān)于私有成員

            以前一直理解錯(cuò)誤,一直以為私有成員是對(duì)象的,不是類的,現(xiàn)在想想,自己真笨,編譯器怎么可能檢查到運(yùn)行時(shí)的對(duì)象的私有成員是否被別的代碼使用了呢?編譯器能做的只能是檢查類的聲明和定義,所以私有成員是類的,也就是同類所有對(duì)象的,而不是某一個(gè)對(duì)象的。只要在同一個(gè)類聲明和成員函數(shù)定義體內(nèi),私有成員是可以隨便使用的。

            posted @ 2009-08-19 22:57 把握命運(yùn) 閱讀(172) | 評(píng)論 (0)編輯 收藏

            2009年8月18日 #

            __cdecl、__stdcall、__fastcall

                 摘要: 1.這三個(gè)修飾符的基本意思   __cdecl:C調(diào)用方式,VC默認(rèn)使用該方式,參數(shù)從右向左傳遞,參數(shù)個(gè)數(shù)可變,棧的初始和清理由調(diào)用者完成   __stdcall:標(biāo)準(zhǔn)調(diào)用方式,多種語(yǔ)言使用這種調(diào)用方式,參數(shù)從右向左傳遞,參數(shù)個(gè)數(shù)不可變,棧的初始和清理由被調(diào)用者完成   __fastcall:參數(shù)盡量使用寄存...  閱讀全文

            posted @ 2009-08-18 23:05 把握命運(yùn) 閱讀(1451) | 評(píng)論 (0)編輯 收藏

            exe、dll的進(jìn)入點(diǎn),以及main、winmain、dllmain的關(guān)系

            靜態(tài)鏈接的情況不考慮,因?yàn)檫@種情況就是把所有代碼合并到exe中,不需要進(jìn)入點(diǎn)。

            進(jìn)入點(diǎn)就是系統(tǒng)在加載一個(gè)可執(zhí)行代碼塊(主要是exe和dll)到內(nèi)存的時(shí)候,系統(tǒng)將要調(diào)用的起始代碼的位置。

            加載分為啟動(dòng)時(shí)加載和運(yùn)行時(shí)加載,這兩種說(shuō)法主要是針對(duì)dll的,因?yàn)閑xe加載必然會(huì)創(chuàng)建一個(gè)新的進(jìn)程,所以exe加載都是啟動(dòng)時(shí)加載,就算是createprocess也應(yīng)該說(shuō)是啟動(dòng)時(shí)加載。而dll分為兩種情況,第一種就是隨著exe的加載一起加載到內(nèi)存的同一進(jìn)程地址空間中,另一種則是exe中的代碼loadlibrary在運(yùn)行時(shí)加載dll到當(dāng)前exe的進(jìn)程地址空間中。
            無(wú)論上面哪種情況,只要加載,系統(tǒng)就會(huì)一定在加載的時(shí)候調(diào)用進(jìn)入點(diǎn)代碼,所以加載方式與進(jìn)入點(diǎn)完全不影響。

            win sdk文檔中exe的進(jìn)入點(diǎn)有兩個(gè),一個(gè)是main,另一個(gè)是winmain,這個(gè)進(jìn)入點(diǎn)是可以改的,但是在c運(yùn)行環(huán)境下,連接器一般把進(jìn)入點(diǎn)默認(rèn)設(shè)置為mainCRTStartupWinMainCRTStartup,因?yàn)閏運(yùn)行時(shí)需要在代碼執(zhí)行前進(jìn)行一些別的工作,所以就修改為前面兩個(gè)c入口點(diǎn),然后這兩個(gè)函數(shù)再分別調(diào)用main和winmain。c運(yùn)行時(shí)需要作的特別工作就是初始化c運(yùn)行時(shí)環(huán)境,包括靜態(tài)、全局變量和對(duì)象初始化。當(dāng)main或者winmain返回時(shí)就又回到了前兩個(gè)函數(shù)中,這兩個(gè)函數(shù)的后半部分就是負(fù)責(zé)清理之前的初始化工作。

            win sdk文檔中的dll的進(jìn)入店是dllmain,同樣在c運(yùn)行時(shí)下,改為_DllMainCRTStartup,系統(tǒng)加載dll時(shí)調(diào)用這個(gè)函數(shù),然后這個(gè)函數(shù)做些初始化工作,再調(diào)用dllmain,然后返回_DllMainCRTStartup結(jié)束執(zhí)行。此時(shí),dll已經(jīng)在進(jìn)程的地址空間中了,該進(jìn)程的exe可以使用dll中的代碼了。如果該dll是啟動(dòng)時(shí)加載,那么在程序結(jié)束時(shí)會(huì)再次調(diào)用_DllMainCRTStartup進(jìn)行清理之前dll初始化的工作,如果是通過(guò)loadlibrary來(lái)運(yùn)行時(shí)加載dll,那么需要exe自己卸載dll,卸載的時(shí)候會(huì)再次調(diào)用_DllMainCRTStartup

             

            posted @ 2009-08-18 18:50 把握命運(yùn) 閱讀(1787) | 評(píng)論 (0)編輯 收藏

            2009年8月12日 #

            CreateFile和WriteFile

            #include"windows.h"
            #include
            "tchar.h"

            LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

            HANDLE g_hFile;
            HANDLE g_hFile1;
            struct sMsg
            {
                DWORD time;
                DWORD message;
            }
            ;

                

            int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE ,LPTSTR lpCmdLine,int nCmdShow)
            {
                
            if(!hInstance) return 0;
                WNDCLASSEX wcex;
                wcex.style 
            = CS_HREDRAW |    CS_OWNDC|CS_VREDRAW ;          //常用設(shè)置,這個(gè)設(shè)置定義類在遇到各種情況時(shí)的行為,不過(guò)都是些可有可無(wú)的東西
                wcex.lpszClassName = TEXT("FIRSTCLASS");                         //類名,必須存在,這是引用類的差不多唯一的標(biāo)志,另一個(gè)是class atom
                wcex.hInstance = hInstance;                                                    //類所屬的模塊句柄,如果style中有CS_OWNDC,相反,如果是CS_CLASSDC的話,這個(gè)類就屬于這個(gè)進(jìn)程
                wcex.lpszMenuName = NULL;                                               //這是個(gè)指向菜單資源的指針,如果是NULL的話,則沒(méi)有菜單
                wcex.hCursor = LoadCursor(NULL,IDC_ARROW);           //加載鼠標(biāo)圖標(biāo),如果是NULL的話,系統(tǒng)沒(méi)有默認(rèn)的鼠標(biāo)圖標(biāo),因此圖標(biāo)會(huì)出現(xiàn)未定義情況
                wcex.hIcon  = NULL;                                                               //系統(tǒng)會(huì)加載默認(rèn)圖標(biāo)
                wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
                wcex.lpfnWndProc 
            = WindowProc;
                wcex.cbClsExtra 
            =0;                                                               //分配給類的額外內(nèi)存,根本用不上,設(shè)為0
                wcex.cbWndExtra = 0;                                                        //分配給由這個(gè)類產(chǎn)生的所有窗口的每一個(gè)內(nèi)存大小,用不上,0
                wcex.cbSize = sizeof(WNDCLASSEX);                             //類的大小,這個(gè)估計(jì)是以后擴(kuò)展的時(shí)候用的吧,總共兩種,難道是用來(lái)區(qū)分普通類和擴(kuò)展類???
                wcex.hIconSm = NULL;                                                          //小型圖標(biāo),NULL,系統(tǒng)知道如何處理,影響不了程序的正常運(yùn)行

                
            if(!RegisterClassEx(&wcex))                                //函數(shù)失敗,返回0,否則返回一個(gè)atom,這個(gè)atom是用來(lái)標(biāo)記類的,但是用的不多,能用類名的地方,也能用這東西
                {
                    
            return 0;
                }


                g_hFile   
            =   CreateFile(L"d:\\pe\\messagefile.txt",         //   file   to   open   
                GENERIC_WRITE,                     //   open   for   reading   
                FILE_SHARE_WRITE,               //   share   for   reading   
                NULL,                                     //   default   security   
                OPEN_ALWAYS,                   //   existing   file   only   
                FILE_ATTRIBUTE_NORMAL,   //   normal   file   
                NULL);   

                g_hFile1 
            = CreateFile(L"messagefile1.txt",
                    GENERIC_WRITE,
                    FILE_SHARE_WRITE,
                    NULL,
                    OPEN_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);

                
            //下面的這個(gè)函數(shù)和CreateWindow是同一個(gè),只是define了幾個(gè)參數(shù)而以,所以現(xiàn)在使用的CreateWindow就是CreateWindowEx
                HWND hWnd = CreateWindowEx(0L,_T("FIRSTCLASS"),_T("name"),WS_OVERLAPPEDWINDOW ,CW_USEDEFAULT,CW_USEDEFAULT,640,480,NULL,NULL,hInstance,NULL);
                
            if(!hWnd)
                
            {
                    
            return 0;
                }

                    
                ShowWindow(hWnd,nCmdShow  );
                

                MSG msg 
            = {0};
                DWORD nbuffer;
                
            while(GetMessage(&msg,NULL,0,0))
                
            {
                    TranslateMessage(
            &msg);

                    sMsg smsg 
            = {0};
                    smsg.time 
            = msg.time;
                    smsg.message 
            = msg.message;
                    WriteFile(  g_hFile1,   
            &smsg,   sizeof(smsg),   &nbuffer,   NULL  );  
                    
                    DispatchMessage(
            &msg);
                }


                CloseHandle(g_hFile); 
                CloseHandle(g_hFile1);

                
            return (int)msg.wParam;


            }



            LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
            {
                DWORD nbuffer;
                WriteFile( g_hFile,   
            &uMsg,   sizeof(uMsg),   &nbuffer,   NULL  );   



                PAINTSTRUCT ps;
                HDC hdc;

                
            switch(uMsg)
                
            {
                
            case WM_PAINT:
                    hdc 
            = BeginPaint(hWnd,&ps);
                    EndPaint(hWnd,
            &ps);
                    
            break;
                
            case WM_DESTROY:
                    PostQuitMessage(
            0);
                    
            break;
                
            default:
                    
            return DefWindowProc(hWnd,uMsg,wParam,lParam);
                }

                
            return 0;
            }

            posted @ 2009-08-12 19:46 把握命運(yùn) 閱讀(592) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題  下一頁(yè)
            久久精品国产亚洲AV无码麻豆| 久久777国产线看观看精品| 久久精品免费观看| 国产精品美女久久久m| 国产产无码乱码精品久久鸭| 97久久超碰成人精品网站| 99久久精品国产麻豆| 国产精品一久久香蕉国产线看 | 婷婷久久综合| 国产香蕉久久精品综合网| 久久人人爽人人爽人人片AV麻烦| 伊人情人综合成人久久网小说| 精品久久久久久久国产潘金莲 | 亚洲va中文字幕无码久久| 新狼窝色AV性久久久久久| 久久综合给合久久狠狠狠97色69| 2021久久精品国产99国产精品| 久久91精品国产91久久户| 久久久久亚洲爆乳少妇无 | 狠狠色噜噜色狠狠狠综合久久| 亚洲精品无码久久久久久| 国产欧美一区二区久久| 久久精品国产72国产精福利| 久久只有这精品99| 国产91色综合久久免费| 久久夜色撩人精品国产小说| 无码人妻精品一区二区三区久久久| 久久伊人精品青青草原高清| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲日本久久久午夜精品| 日韩av无码久久精品免费| 91久久香蕉国产熟女线看| 久久久SS麻豆欧美国产日韩| 日韩亚洲欧美久久久www综合网| 久久笫一福利免费导航 | 久久精品极品盛宴观看| 99国产精品久久久久久久成人热| 色婷婷噜噜久久国产精品12p| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久久久人妻一区精品| 免费精品99久久国产综合精品|