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

            Re:誰(shuí)知道禁用USB端口的函數(shù)啊!?! 是不是要自己寫(xiě)方法哦!
            http://www.codeproject.com/system/EnumDevices.asp
            http://www.codeproject.com/system/change_drive_sn.asp
            http://www.codeproject.com/system/installed_programs.asp
            http://www.codeproject.com/system/enum_display_modes.asp
            http://www.codeproject.com/system/serial_portsenum_fifo.asp
            1Minimize any window to system tray using Windows Hook
            http://www.codeproject.com/system/DevicePropertySheet.asp
            http://www.codeproject.com/system/chaiyasit_t.asp
            http://www.codeproject.com/system/DevMgr.asp     001
            http://www.codeproject.com/system/eject_cdrom.asp
            http://www.codeproject.com/system/serviceskeleton.asp    002
            http://www.codeproject.com/useritems/HwDetect.asp    003








            Re:誰(shuí)知道禁用USB端口的函數(shù)啊!?! 是不是要自己寫(xiě)方法哦!
            我做了個(gè)MP3的量產(chǎn)軟件,當(dāng)對(duì)MP3的文件download完成后會(huì)將MP3安全移除。
            問(wèn)題是:我用GUID{0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}會(huì)將USB鍵盤(pán)和USB鼠標(biāo)全都枚舉出來(lái),這樣我就無(wú)法區(qū)分誰(shuí)是MP3,誰(shuí)是USB鍵盤(pán)和鼠標(biāo)了。雖然枚舉時(shí)我可以得到PID和VID,但是我們的PID和VID可能會(huì)被代理商更改,所以也就不能通過(guò)PID和VID來(lái)區(qū)分了,不知PC上的安全刪除U盤(pán)是怎樣做到的,PC應(yīng)該可以將盤(pán)符和對(duì)應(yīng)的設(shè)備對(duì)應(yīng)起來(lái),且能用唯一的標(biāo)識(shí)來(lái)區(qū)分每臺(tái)設(shè)備,情況緊急,求求各位高手拉我一把吧,非常感謝!

            我的代碼如下:
            void CLogicDriveList::RemoveDevice(size_t index)
            {
            char szDevDesc[256] = {0};
            HDEVINFO hDevInfo;
            string Prod;
            string Rev;

            //遍歷所有的設(shè)備
            hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE) if ( INVALID_HANDLE_VALUE == hDevInfo)return;

            SP_DEVINFO_DATA devInfoData;
            devInfoData.cbSize = sizeof(devInfoData);

            int Index = 0;
            while(SetupDiEnumDeviceInfo(hDevInfo, Index++, &devInfoData))
            {
            //獲取設(shè)備ID
            std::string devId;
            memset(szDevDesc, 0, sizeof(szDevDesc));
            devInfoData.cbSize = sizeof(devInfoData);

            CM_Get_Device_ID(devInfoData.DevInst, szDevDesc, sizeof(szDevDesc),0);
            devId = szDevDesc;
            cout<<devId<<endl;
            //比較設(shè)備ID
            if(這里該怎樣填呢?)
            {
            if(EjectDevice(devInfoData))
            {
            cout<<"Remove device "<<m_LogicDrives [index].Symbol<<": ok"<<endl;
            break;
            }
            else
            cout<<"Remove device "<<m_LogicDrives[index].Symbol<<": fail"<<endl;
            }
            }
            }

            bool CLogicDriveList::EjectDevice(const SP_DEVINFO_DATA &devInfoData)
            {
            PNP_VETO_TYPE   pnpvietotype;  
            char vetoname[MAX_PATH] = {0};  
            CONFIGRET cr = CM_Request_Device_Eject(devInfoData.DevInst,  
                                    &pnpvietotype,
            vetoname,
            MAX_PATH,
            0);  
            return CR_SUCCESS==cr;
            }
            posted @ 2011-01-26 10:44 wrh 閱讀(973) | 評(píng)論 (0)編輯 收藏
            void   CRegExplorerView::EnumerateValues(HKEY   hKey,   LPCTSTR   cstrKey) 
            { 
             static   HKEY   hLastKey   =   hKey; 
             LONG   lResult; 
             DWORD   dwIndex   =   0; 
             HKEY   hCurKey   =   hKey; 
             DWORD   dwKeyType;   
             DWORD   dwKeyDataLength,   dwKeyNameLen; 
             LPBYTE   pbbinKeyData   =   NULL;   
             TCHAR   *tcKeyName   =   NULL; 
             TCHAR   tcDataType[1024]   =   _T( " "); 
             lResult   =   RegOpenKeyEx(hCurKey,   cstrKey,   0,   KEY_QUERY_VALUE   ,   &hKey); 
             if(lResult   !=   ERROR_SUCCESS) 
              return; 
             DWORD   lNoOfValues   =   0; 
             DWORD   lLongestKeyNameLen   =   1; 
             DWORD   lLongestDataLen   =   1; 

             lResult   =   RegQueryInfoKey(hKey,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   &lNoOfValues,   &lLongestKeyNameLen,   &lLongestDataLen,NULL,   NULL); 

             if(lResult   !=   ERROR_SUCCESS) 
              return; 
             hLastKey   =   hKey; 
             lLongestKeyNameLen++; 
             lLongestDataLen++; 
             tcKeyName   =   new   TCHAR[lLongestKeyNameLen]; 
             pbbinKeyData   =   new   BYTE[lLongestDataLen]; 
             CString   cstrFinalData,   cstrTemp; 
             while(TRUE) 
             { 
              memset(pbbinKeyData,   0,   lLongestDataLen); 
              memset(tcKeyName,   0,   lLongestKeyNameLen); 
              dwKeyType   =   dwKeyDataLength   =   dwKeyNameLen   =   0; 
              dwKeyNameLen   =   lLongestKeyNameLen; 
              dwKeyDataLength   =   lLongestDataLen; 
              lResult   =   RegEnumValue(hKey,   dwIndex,   tcKeyName,   &dwKeyNameLen,   NULL,   &dwKeyType,   pbbinKeyData,   &dwKeyDataLength); 
              if(lResult   ==   ERROR_NO_MORE_ITEMS) 
               break; 
              AddRegistryItem(tcKeyName,   dwKeyType,   pbbinKeyData,   dwKeyDataLength,   dwIndex);//顯示數(shù)據(jù)于ListView 
              dwIndex++; 
             } 
             RegCloseKey(hKey); 
             delete   tcKeyName; 
             delete   pbbinKeyData; 
            }
            posted @ 2011-01-05 13:27 wrh 閱讀(331) | 評(píng)論 (0)編輯 收藏
            請(qǐng)教各位: 
              用RegEnumKeyEx枚舉一個(gè)鍵下的所有子鍵,例如HKEY_LOCAL_MACHINE\Software\ListItem下有6個(gè)子鍵,分別是111,432fdksaf,fd3425,fd5432,89342,tewjfds,用RegEnumKeyEx可以枚舉出后3個(gè)子鍵(我是從后向前進(jìn)行的),但是只能得到后3個(gè)的全名,前3個(gè)就只能得到前2個(gè)或3個(gè)字母(例如:432fdksaf就只能得到432),不知道為什么,如果是從前向后進(jìn)行就只能得到前3個(gè)的全名,后3個(gè)就只能前2個(gè)或3個(gè)字母了。
            這是一個(gè)簡(jiǎn)單的例子。 
            查看 "http://注意這兩行 "的注釋處。:) 

            void   CRegistryView::OnButton3()   
            { 
            //   TODO:   Add   your   control   notification   handler   code   here 
            HKEY   hkey; 
            LPCSTR   data_Get= "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run "; 
            long   ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Get,0,KEY_ALL_ACCESS,&hkey); 
            if   (ret0!=ERROR_SUCCESS) 
            { 
            MessageBox( "Error! "); 
            return; 
            } 
            TCHAR   szBuffer[256]; 
            DWORD   dwSize=256; 
            ZeroMemory(szBuffer,256); 
            DWORD   dIndex; 
            dIndex=0L; 
            while(RegEnumValue(hkey,dIndex,szBuffer,&dwSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS) 
            { 
            MessageBox(szBuffer, " "); 
            dIndex++; 
            ZeroMemory(szBuffer,256);   //注意這兩行 
            dwSize=256;                               // 
            } 
            return; 
            }

            問(wèn)題解決了,不過(guò)我發(fā)現(xiàn)ZeroMemory(szBuffer,256);   這行可以不要要,只用重新設(shè)置dwSize的值就行了,因?yàn)镽egEnumKeyEx是用&dwSize來(lái)調(diào)用的,完成后dwSize的值就會(huì)改變了,只要重新設(shè)置一下就行了,至于上面那行,應(yīng)該是為防止緩沖區(qū)中的值出錯(cuò)而設(shè)置的。
            posted @ 2011-01-05 13:24 wrh 閱讀(1977) | 評(píng)論 (0)編輯 收藏

            #include "Wininet.h"
            #pragma comment(lib,"Wininet.lib")

            DWORD   flags;//上網(wǎng)方式  
            BOOL   m_bOnline;//是否在線(xiàn)  
               
            m_bOnline=InternetGetConnectedState(&flags,0);  

             if(m_bOnline)//在線(xiàn)  
            {  
                      int b;
                      if ( flags& INTERNET_CONNECTION_MODEM )
                      {
                             b = flags& INTERNET_CONNECTION_MODEM;
                      } 
                      else if ( flags&INTERNET_CONNECTION_LAN )
                      {
                             b = flags&INTERNET_CONNECTION_LAN;
                      }
                      else if ( flags& INTERNET_CONNECTION_PROXY )
                      {
                             b = flags& INTERNET_CONNECTION_PROXY;
                      }
                      switch(b)  
                      {  
                      case   INTERNET_CONNECTION_MODEM   :  
                              AfxMessageBox("在線(xiàn):撥號(hào)上網(wǎng)");  
                              break;  
                      case   INTERNET_CONNECTION_LAN   :  
                              AfxMessageBox("在線(xiàn):通過(guò)局域網(wǎng)");  
                              break;  
                      case   INTERNET_CONNECTION_PROXY   :  
                              AfxMessageBox("在線(xiàn):代理");  
                              break;  
                      }  
                      if(flags&INTERNET_CONNECTION_MODEM_BUSY==INTERNET_CONNECTION_MODEM_BUSY)  
                              AfxMessageBox("MODEM被其他非INTERNET連接占用");  
            }  
            else  
                          AfxMessageBox("不在線(xiàn)");

            或者
            #include "Wininet.h"
            #pragma comment(lib,"Wininet.lib")

            DWORD   flags;//上網(wǎng)方式  
            BOOL   m_bOnline;//是否在線(xiàn)  
               
            m_bOnline=InternetGetConnectedState(&flags,0);  

             if(m_bOnline)//在線(xiàn)  
            {  
                      if ( flags& INTERNET_CONNECTION_MODEM )
                          AfxMessageBox("在線(xiàn):撥號(hào)上網(wǎng)");  

                     else if ( flags&INTERNET_CONNECTION_LAN  )
                          AfxMessageBox("在線(xiàn):通過(guò)局域網(wǎng)");

                     else if ( flags& INTERNET_CONNECTION_PROXY)
                          AfxMessageBox("在線(xiàn):代理");
                    
                     else if ( flags&INTERNET_CONNECTION_MODEM_BUSY )
                           AfxMessageBox("MODEM被其他非INTERNET連接占用");   
            }  
            else  
                          AfxMessageBox("不在線(xiàn)");


            詳細(xì)說(shuō)明:
            雖然MSDN中定義了7種參數(shù)類(lèi)型,但實(shí)際中wininet.h頭文件中只對(duì)四種類(lèi)型的值進(jìn)行了定義
            7種類(lèi)型:
            INTERNET_CONNECTION_LAN          局域網(wǎng)
            INTERNET_CONNECTION_MODEM        撥號(hào)上網(wǎng)
            INTERNET_CONNECTION_PROXY       代理
            INTERNET_CONNECTION_MODEM_BUSY  代理被占用

            INTERNET_CONNECTION_CONFIGURED    雖然可以聯(lián)網(wǎng),但當(dāng)前不可用
            INTERNET_CONNECTION_OFFLINE     離線(xiàn)
            INTERNET_RAS_INSTALLED       RAS安裝

             Wininet.h頭文件中值定義:
            // Flags for InternetGetConnectedState
            #define INTERNET_CONNECTION_MODEM             1
            #define INTERNET_CONNECTION_LAN                2
            #define INTERNET_CONNECTION_PROXY             4
            #define INTERNET_CONNECTION_MODEM_BUSY      8

            然而實(shí)際的返回值卻并不是這四種值,本人現(xiàn)在是windows xp操作系統(tǒng),vc++ 6.0,局域網(wǎng)上網(wǎng),結(jié)果返回值是18,也就是10010,所以比INTERNET_CONNECTION_LAN的值2多了一位,也就是00010,返回值最高位1是多出來(lái)的,


            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sichuanpb/archive/2010/09/21/5898449.aspx

            posted @ 2011-01-02 18:04 wrh 閱讀(750) | 評(píng)論 (0)編輯 收藏
            Visual C++ 確定要使用的導(dǎo)出方法 (轉(zhuǎn)自MSDN)

            若要確定用于導(dǎo)出函數(shù)的方法(.def 文件或 __declspec(dllexport) 關(guān)鍵字),請(qǐng)回答下列問(wèn)題:

            • 是否要一直添加附加的導(dǎo)出函數(shù)?

            • 誰(shuí)要使用 DLL?例如,是由許多無(wú)法重新生成的可執(zhí)行文件使用的第三方 DLL 還是僅由可以輕松重新生成的應(yīng)用程序使用的 DLL?

            使用 .DEF 文件的優(yōu)缺點(diǎn)

            在 .def 文件中導(dǎo)出函數(shù)使您得以控制導(dǎo)出序號(hào)。當(dāng)將附加的導(dǎo)出函數(shù)添加到 DLL 時(shí),可以給它們分配更高的序號(hào)值(高于任何其他導(dǎo)出函數(shù))。當(dāng)您進(jìn)行此操作時(shí),使用隱式鏈接的應(yīng)用程序不必與包含新函數(shù)的新導(dǎo)入庫(kù)重新鏈接。這非常重要,例如,在設(shè)計(jì)將由許多應(yīng)用程序使用的第三方 DLL 時(shí)。可以通過(guò)添加附加功能不斷地增強(qiáng) DLL,同時(shí)確保現(xiàn)有應(yīng)用程序繼續(xù)正常使用新的 DLL。MFC DLL 是使用 .def 文件生成的。

            使用 .def 文件的另一個(gè)優(yōu)點(diǎn)是:可以使用 NONAME 屬性導(dǎo)出函數(shù),該屬性?xún)H將序號(hào)放到 DLL 的導(dǎo)出表中。對(duì)具有大量導(dǎo)出函數(shù)的 DLL,使用 NONAME 屬性可以減小 DLL 文件的大小。有關(guān)編寫(xiě)模塊定義語(yǔ)句的信息,請(qǐng)參見(jiàn)模塊定義語(yǔ)句的規(guī)則。有關(guān)序號(hào)導(dǎo)出的更多信息,請(qǐng)參見(jiàn)按序號(hào)而不是按名稱(chēng)從 DLL 導(dǎo)出函數(shù)

            使用 .def 文件的主要缺點(diǎn)是:在 C++ 文件中導(dǎo)出函數(shù)時(shí),必須將修飾名放到 .def 文件中,或者通過(guò)使用外部“C”用標(biāo)準(zhǔn) C 鏈接定義導(dǎo)出函數(shù),以避免編譯器進(jìn)行名稱(chēng)修飾。

            如果需要將修飾名放到 .def 文件中,則可以通過(guò)使用 DUMPBIN 工具或 /MAP 鏈接器選項(xiàng)來(lái)獲取修飾名。請(qǐng)注意,編譯器產(chǎn)生的修飾名是編譯器特定的。如果將 Visual C++ 編譯器產(chǎn)生的修飾名放到 .def 文件中,則鏈接到 DLL 的應(yīng)用程序必須也是用相同版本的 Visual C++ 生成的,這樣調(diào)用應(yīng)用程序中的修飾名才能與 DLL 的 .def 文件中的導(dǎo)出名相匹配。

            使用 __declspec(dllexport) 的優(yōu)缺點(diǎn)

            使用 __declspec(dllexport) 非常方便,因?yàn)椴槐乜紤]維護(hù) .def 文件和獲取導(dǎo)出函數(shù)的修飾名。例如,如果您設(shè)計(jì)的 DLL 供自己控制的應(yīng)用程序使用,則此方法很適用。如果通過(guò)新的導(dǎo)出函數(shù)重新生成 DLL,還必須重新生成應(yīng)用程序,因?yàn)槿绻褂貌煌姹镜木幾g器進(jìn)行重新編譯,則導(dǎo)出的 C++ 函數(shù)的修飾名可能會(huì)發(fā)生變化。

            posted @ 2010-12-28 13:48 wrh 閱讀(643) | 評(píng)論 (0)編輯 收藏
            轉(zhuǎn)載自 yibansha0
            最終編輯 yibansha0

            調(diào)用DLL有兩種方法:靜態(tài)調(diào)用和動(dòng)態(tài)調(diào)用.
            (一).靜態(tài)調(diào)用其步驟如下:
            1.把你的youApp.DLL拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)的Debug目錄下;
            2.把你的youApp.lib拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)目錄下;
            3.把你的youApp.h(包含輸出函數(shù)的定義)拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)目
            錄下;
            4.打開(kāi)你的目標(biāo)工程選中工程,選擇Visual C++的Project主菜單的Settings菜單;
            5.執(zhí)行第4步后,VC將會(huì)彈出一個(gè)對(duì)話(huà)框,在對(duì)話(huà)框的多頁(yè)顯示控件中選擇Link頁(yè)。然
            后在Object/library modules輸入框中輸入:youApp.lib
            6.選擇你的目標(biāo)工程Head Files加入:youApp.h文件;
            7.最后在你目標(biāo)工程(*.cpp,需要調(diào)用DLL中的函數(shù))中包含你的:#include "youApp.h "
            注:youApp是你DLL的工程名。
            2.動(dòng)態(tài)調(diào)用其程序如下:
            動(dòng)態(tài)調(diào)用時(shí)只需做靜態(tài)調(diào)用步驟1.
            {
            HINSTANCE hDllInst = LoadLibrary( "youApp.DLL ");
            if(hDllInst)
            {
            typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
            MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函數(shù)別名
            youFuntionNameAlias = (MYFUNC)GetProcAddress
            (hDllInst, "youFuntionName ");
            // youFuntionName 在DLL中聲明的函數(shù)名
            if(youFuntionNameAlias)
            {
            youFuntionNameAlias(param1,param2);
            }
            FreeLibrary(hDllInst);
            }
            }

             

             

             

             

            原文出處: codeguru

            我正在學(xué)習(xí)DLLs,談不上對(duì)其有什么高屋建瓴的見(jiàn)解;本文只是(通過(guò))編碼讓你看到并想知道代碼是如何運(yùn)行的。在本文中,我假定你知道如何使用你的編譯器特性,比如設(shè)置目錄路徑等等。

             

            為了建立項(xiàng)目,請(qǐng)選擇Win32 控制臺(tái)項(xiàng)目(Win32 Console Application),并且在應(yīng)用程序設(shè)置標(biāo)簽(the advanced tab)上,選擇DLL和空項(xiàng)目選項(xiàng)。DLLs可能并不如你想像的那樣難。首先寫(xiě)你的頭文件(header file);稱(chēng)為DLLTutorial.h。這個(gè)文件與其它頭文件一樣,其中只是一些函數(shù)的原型。

            #ifndef _DLL_TUTORIAL_H_
            #define _DLL_TUTORIAL_H_
            #include <iostream> #if defined DLL_EXPORT
            #define DECLDIR __declspec(dllexport)
            #else
            #define DECLDIR __declspec(dllimport)
            #endif

            extern "C"
            {
            DECLDIR int Add( int a, int b );
            DECLDIR void Function( void );
            }
            #endif

            前面兩行指示編譯器只包含這個(gè)文件一次。extern "C"告訴編譯器該部分可以在C/C++中使用。

            在VC++中這里有兩個(gè)方法來(lái)導(dǎo)出函數(shù):

                 1、使用__declspec,一個(gè)Microsoft定義的關(guān)鍵字。

                 2、創(chuàng)建一個(gè)模塊定義文件(Module-Definition File即.DEF)。第一種方法稍稍比第二種方法簡(jiǎn)單些,但兩種都工作得很好。

            __declspec(dllexport)導(dǎo)出函數(shù)符號(hào)到在你的DLL中的一個(gè)存儲(chǔ)類(lèi)。當(dāng)下面一行被定義時(shí)我定義DECLDIR來(lái)運(yùn)行這個(gè)函數(shù),

            #define DLL_EXPORT

            同時(shí)也導(dǎo)入函數(shù)如果下面一行

            #define DLL_EXPORT

            沒(méi)有在源文件中出現(xiàn)。在此情況下,你將導(dǎo)出函數(shù)Add(int a, int b)和Function()。

            現(xiàn)在,你需要寫(xiě)一個(gè)將要稱(chēng)為DLLTutorial.cpp的源文件。

            #include <iostream>
            #include "DLL_Tutorial.h"

            #define DLL_EXPORT extern "C"
            {
            DECLDIR int Add( int a, int b )
            {
            return( a + b );
            } DECLDIR void Function( void )
            {
            std::cout << "DLL Called!" << std::endl;
            } }

            這里你定義了(DLL中的)所有函數(shù)。Int Add(int a, int b)只簡(jiǎn)單地將兩個(gè)數(shù)相加而void Function(void)只是在你的DLL被調(diào)用時(shí)(將信息)通知你。在我像你展示如何使用DLL前,我想告訴你一些關(guān)于模塊定義文件(.def)的內(nèi)容。

            模塊定義文件(.def)

            模塊定義文件是一個(gè)有著.def文件擴(kuò)展名的文本文件。它被用于導(dǎo)出一個(gè)DLL的函數(shù),和__declspec(dllexport)很相似,但是.def文件并不是Microsoft定義的。一個(gè).def文件中只有兩個(gè)必需的部分:LIBRARY 和 EXPORTS。讓我們先看一個(gè)基本的.def文件稍后我將解析之。

            LIBRARY dll_tutorial
            DESCRIPTION "our simple DLL"
            EXPORTS
            Add @1
            Function @2

            第一行,''LIBRARY''是一個(gè)必需的部分。它告訴鏈接器(linker)如何命名你的DLL。下面被標(biāo)識(shí)為''DESCRIPTION''的部分并不是必需的,但是我喜歡把它放進(jìn)去。該語(yǔ)句將字符串寫(xiě)入 .rdata 節(jié)[據(jù) MSDN],它告訴人們誰(shuí)可能使用這個(gè)DLL,這個(gè)DLL做什么或它為了什么(存在)。再下面的部分標(biāo)識(shí)為''EXPORTS''是另一個(gè)必需的部分;這個(gè)部分使得該函數(shù)可以被其它應(yīng)用程序訪(fǎng)問(wèn)到并且它創(chuàng)建一個(gè)導(dǎo)入庫(kù)。當(dāng)你生成這個(gè)項(xiàng)目時(shí),不僅是一個(gè).dll文件被創(chuàng)建,而且一個(gè)文件擴(kuò)展名為.lib的導(dǎo)出庫(kù)也被創(chuàng)建了。除了前面的部分以外,這里還有其它四個(gè)部分標(biāo)識(shí)為:NAME, STACKSIZE, SECTIONS, 和 VERSION。我將不再在本文中涉及這些內(nèi)容,但是如果你在Internet上搜索,我想你將找到一些東西(譯注: MSDN2003上對(duì)模板定義文件各部分內(nèi)容有詳盡解釋?zhuān)?qǐng)參閱)。另外,一個(gè)分號(hào)(;)開(kāi)始一個(gè)注解,如同''//''在C++中一樣。

            現(xiàn)在你已經(jīng)創(chuàng)建了你的DLL,你需要學(xué)習(xí)如何在一個(gè)應(yīng)用程序中使用它了。當(dāng)這個(gè)DLL被生成后,它創(chuàng)建了一個(gè).dll文件和一個(gè).lib文件;這兩個(gè)都是你需要的。

            隱式鏈接

            這里有兩個(gè)方法來(lái)載入一個(gè)DLL;一個(gè)方法是捷徑另一個(gè)則相比要復(fù)雜些。捷徑是只鏈接到你.lib 文件并將.dll文件置入你的新項(xiàng)目的路徑中去。因此,創(chuàng)建一個(gè)新的空的Win32控制臺(tái)項(xiàng)目并添加一個(gè)源文件。將你做的DLL放入你的新項(xiàng)目相同的目錄下。

             

            #include <iostream>
            #include <DLLTutorial.h>

            int main()
            {
            Function();
            std::cout << Add(32, 58) << "\n";
            return(1);
            }

            你必需要鏈接到DLLTutorial.lib文件。我在項(xiàng)目屬性中設(shè)置了,但是你可能會(huì)用下面的語(yǔ)句代替:

            #pragma comment(lib, "DLLTutorial.lib")


            請(qǐng)注意我讓編譯器來(lái)查看我的DLL文件夾已獲得.lib文件同時(shí)讓它順便看下該目錄中的DLL頭文件。如果你不想這么做,你可以總是把他們放入你的新項(xiàng)目的目錄中并使用""(引號(hào))而不是<>。這就是載入一個(gè)DLL的簡(jiǎn)單方法。

            顯示鏈接

            難點(diǎn)的加載DLL的方法是有稍微有點(diǎn)復(fù)雜的。你將需要函數(shù)指針和一些Windows函數(shù)。但是,通過(guò)這種載入DLLs的方法,你不需要DLL的.lib或頭文件,而只需要DLL。下面列出一些代碼,我稍后將解析之。

            #include <iostream>
            #include <windows.h>

            typedef int (*AddFunc)(int,int);
            typedef void (*FunctionFunc)();

            int main()
            {
            AddFunc _AddFunc;
            FunctionFunc _FunctionFunc;
            HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll"); if (hInstLibrary == NULL)
            {
            FreeLibrary(hInstLibrary);
            }

            _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
            _FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function"); if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
            {
            FreeLibrary(hInstLibrary);
            } std::cout << _AddFunc(23, 43) << std::endl;
            _FunctionFunc(); std::cin.get(); FreeLibrary(hInstLibrary); return(1);
            }

            首先你會(huì)注意到:這里包括進(jìn)了文件“windows.h”同時(shí)移走了“DLL_Tutorial.h”。原因很簡(jiǎn)單:因?yàn)閣indows.h包含了一些Windows函數(shù),當(dāng)然你現(xiàn)在將只需要其中幾個(gè)而已。它也包含了一些將會(huì)用到的Windows特定變量。你可以去掉DLL的頭文件(DLL_Tutorial.h)因?yàn)椋缥仪懊嫠f(shuō)-當(dāng)你使用這個(gè)方法載入DLL時(shí)你并不需要它。

            下面你會(huì)看到:以下面形式的一小塊古靈精怪的代碼:

            typedef int (*AddFunc)(int,int);
            typedef void (*FunctionFunc)();

            這是函數(shù)指針。因?yàn)檫@是一個(gè)關(guān)于DLL的自學(xué)指南,深入探究函數(shù)指針超出了本指南的范圍;因此,現(xiàn)在我們只把它們當(dāng)作DLL包含的函數(shù)的別名。我喜歡在尾部用“Func”命名之。(int,int)部分是這個(gè)函數(shù)的參數(shù)部分,比如,Add函數(shù)要獲得兩個(gè)整數(shù);因此,你需要它們(譯注:指(int,int)部分)作為函數(shù)指針的參數(shù)。Function函數(shù)沒(méi)有參數(shù),因此你讓它為空。main()部分中的前面兩行是聲明函數(shù)指針以使得你可以認(rèn)為它們等同于DLL內(nèi)部的函數(shù)。我只是喜歡預(yù)先定義它們。

            一個(gè)HINSTANCE是一個(gè)Windows數(shù)據(jù)類(lèi)型:是一個(gè)實(shí)例的句柄;在此情況下,這個(gè)實(shí)例將是這個(gè)DLL。你可以通過(guò)使用函數(shù)LoadLibrary()獲得DLL的實(shí)例,它獲得一個(gè)名稱(chēng)作為參數(shù)。在調(diào)用LoadLibrary函數(shù)后,你必需查看一下函數(shù)返回是否成功。你可以通過(guò)檢查HINSTANCE是否等于NULL(在Windows.h中定義為0或Windows.h包含的一個(gè)頭文件)來(lái)查看其是否成功。如果其等于NULL,該句柄將是無(wú)效的,并且你必需釋放這個(gè)庫(kù)。換句話(huà)說(shuō),你必需釋放DLL獲得的內(nèi)存。如果函數(shù)返回成功,你的HINSTANCE就包含了指向DLL的句柄。

            一旦你獲得了指向DLL的句柄,你現(xiàn)在可以從DLL中重新獲得函數(shù)。為了這樣作,你必須使用函數(shù)GetProcAddress(),它將DLL的句柄(你可以使用HINSTANCE)和函數(shù)的名稱(chēng)作為參數(shù)。你可以讓函數(shù)指針獲得由GetProcAddress()返回的值,同時(shí)你必需將GetProcAddress()轉(zhuǎn)換為那個(gè)函數(shù)定義的函數(shù)指針。舉個(gè)例子,對(duì)于Add()函數(shù),你必需將GetProcAddress()轉(zhuǎn)換為AddFunc;這就是它知道參數(shù)及返回值的原因。現(xiàn)在,最好先確定函數(shù)指針是否等于NULL以及它們擁有DLL的函數(shù)。這只是一個(gè)簡(jiǎn)單的if語(yǔ)句;如果其中一個(gè)等于NULL,你必需如前所述釋放庫(kù)。

            一旦函數(shù)指針擁有DLL的函數(shù),你現(xiàn)在就可以使用它們了,但是這里有一個(gè)需要注意的地方:你不能使用函數(shù)的實(shí)際名稱(chēng);你必需使用函數(shù)指針來(lái)調(diào)用它們。在那以后,所有你需要做的是釋放庫(kù)如此而已。

            現(xiàn)在你知道了DLL的一些基本知識(shí)。你知道如何創(chuàng)建它們,你也知道如何用兩種不同的方法鏈接它們。這里仍然有更多的東西需要我們學(xué)習(xí),但我把它們留給你們自己探索了和更棒的作者來(lái)寫(xiě)了。

            posted @ 2010-12-28 13:47 wrh 閱讀(425) | 評(píng)論 (0)編輯 收藏
            顯式(靜態(tài))調(diào)用:
            LIB   +   DLL   +   .H,注意.H中dllexport改為dllimport

            隱式(動(dòng)態(tài))調(diào)用:
            DLL   +   函數(shù)原型聲明,先LoadLibrary,再GetProcAddress(即找到DLL中函數(shù)的地址),不用后FreeLibrary
            顯式(靜態(tài))調(diào)用:
            LIB   +   DLL   +   .H,注意.H中dllexport改為dllimport

            隱式(動(dòng)態(tài))調(diào)用:
            DLL   +   函數(shù)原型聲明,先LoadLibrary,再GetProcAddress(即找到DLL中函數(shù)的地址),不用后FreeLibrary
            顯式(靜態(tài))調(diào)用:
            LIB   +   DLL   +   .H,注意.H中dllexport改為dllimport

            隱式(動(dòng)態(tài))調(diào)用:
            DLL   +   函數(shù)原型聲明,先LoadLibrary,再GetProcAddress(即找到DLL中函數(shù)的地址),不用后FreeLibrary
            顯式(靜態(tài))調(diào)用:
            LIB   +   DLL   +   .H,注意.H中dllexport改為dllimport

            隱式(動(dòng)態(tài))調(diào)用:
            DLL   +   函數(shù)原型聲明,先LoadLibrary,再GetProcAddress(即找到DLL中函數(shù)的地址),不用后FreeLibrary

            調(diào)用DLL有兩種方法:靜態(tài)調(diào)用和動(dòng)態(tài)調(diào)用.
            (一).靜態(tài)調(diào)用其步驟如下:
            1.把你的youApp.DLL拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)的Debug目錄下;
            2.把你的youApp.lib拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)目錄下;
            3.把你的youApp.h(包含輸出函數(shù)的定義)拷到你目標(biāo)工程(需調(diào)用youApp.DLL的工程)目
            錄下;
            4.打開(kāi)你的目標(biāo)工程選中工程,選擇Visual   C++的Project主菜單的Settings菜單;
            5.執(zhí)行第4步后,VC將會(huì)彈出一個(gè)對(duì)話(huà)框,在對(duì)話(huà)框的多頁(yè)顯示控件中選擇Link頁(yè)。然
            后在Object/library   modules輸入框中輸入:youApp.lib
            6.選擇你的目標(biāo)工程Head   Files加入:youApp.h文件;
            7.最后在你目標(biāo)工程(*.cpp,需要調(diào)用DLL中的函數(shù))中包含你的:#include   "youApp.h "
            注:youApp是你DLL的工程名。
            2.動(dòng)態(tài)調(diào)用其程序如下:
            動(dòng)態(tài)調(diào)用時(shí)只需做靜態(tài)調(diào)用步驟1.
            {
            HINSTANCE   hDllInst   =   LoadLibrary( "youApp.DLL ");
            if(hDllInst)
            {
            typedef   DWORD   (WINAPI   *MYFUNC)(DWORD,DWORD);
            MYFUNC   youFuntionNameAlias   =   NULL;   //   youFuntionNameAlias   函數(shù)別名
            youFuntionNameAlias   =   (MYFUNC)GetProcAddress
            (hDllInst, "youFuntionName ");
            //   youFuntionName   在DLL中聲明的函數(shù)名
            if(youFuntionNameAlias)
            {
            youFuntionNameAlias(param1,param2);
            }
            FreeLibrary(hDllInst);
            }
            }






            顯式(靜態(tài))調(diào)用:
            LIB   +   DLL   +   .H,注意.H中dllexport改為dllimport

            隱式(動(dòng)態(tài))調(diào)用:
            DLL   +   函數(shù)原型聲明,先LoadLibrary,再GetProcAddress(即找到DLL中函數(shù)的地址),不用后FreeLibrary



            調(diào)用DLL,首先需要將DLL文件映像到用戶(hù)進(jìn)程的地址空間中,然后才能進(jìn)行函數(shù)調(diào)用,這個(gè)函數(shù)和進(jìn)程內(nèi)部一般函數(shù)的調(diào)用方法相同。Windows提供了兩種將DLL映像到進(jìn)程地址空間的方法:

            1. 隱式的加載時(shí)鏈接
            這種方法需要DLL工程經(jīng)編譯產(chǎn)生的LIB文件,此文件中包含了DLL允許應(yīng)用程序調(diào)用的所有函數(shù)的列表,當(dāng)鏈接器發(fā)現(xiàn)應(yīng)用程序調(diào)用了LIB文件列出的某個(gè)函數(shù),就會(huì)在應(yīng)用程序的可執(zhí)行文件的文件映像中加入一些信息,這些信息指出了包含這個(gè)函數(shù)的DLL文件的名字。當(dāng)這個(gè)應(yīng)用程序運(yùn)行時(shí),也就是它的可執(zhí)行文件被操作系統(tǒng)產(chǎn)生映像文件時(shí),系統(tǒng)會(huì)查看這個(gè)映像文件中關(guān)于DLL的信息,然后將這個(gè)DLL文件映像到進(jìn)程的地址空間。
            系統(tǒng)通過(guò)DLL文件的名稱(chēng),試圖加載這個(gè)文件到進(jìn)程地址空間時(shí),它尋找DLL 文件的路徑按照先后順序如下:
            ·程序運(yùn)行時(shí)的目錄,即可執(zhí)行文件所在的目錄;
            ·當(dāng)前程序工作目錄
            ·系統(tǒng)目錄:對(duì)于Windows95/98來(lái)說(shuō),可以調(diào)用GetSystemDirectory函數(shù)來(lái)得到,對(duì)于WindowsNT/2000來(lái)說(shuō),指的是32位Windows的系統(tǒng)目錄,也可以調(diào)用GetSystemDirectory函數(shù)來(lái)得到,得到的值為SYSTEM32。
            ·Windows目錄
            ·列在PATH環(huán)境變量中的所有目錄
            VC中加載DLL的LIB文件的方法有以下三種:
            ①LIB文件直接加入到工程文件列表中
            在VC中打開(kāi)File View一頁(yè),選中工程名,單擊鼠標(biāo)右鍵,然后選中“Add Files to Project”菜單,在彈出的文件對(duì)話(huà)框中選中要加入DLL的LIB文件即可。
            ②設(shè)置工程的 Project Settings來(lái)加載DLL的LIB文件
            打開(kāi)工程的 Project Settings菜單,選中Link,然后在Object/library modules下的文本框中輸入DLL的LIB文件。
            ③通過(guò)程序代碼的方式
            加入預(yù)編譯指令#pragma comment (lib,”*.lib”),這種方法優(yōu)點(diǎn)是可以利用條件預(yù)編譯指令鏈接不同版本的LIB文件。因?yàn)椋贒ebug方式下,產(chǎn)生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產(chǎn)生的LIB文件是Release版本,如Regr.lib。
            當(dāng)應(yīng)用程序?qū)LL的LIB文件加載后,還需要把DLL對(duì)應(yīng)的頭文件(*.h)包含到其中,在這個(gè)頭文件中給出了DLL中定義的函數(shù)原型,然后聲明。
            2 顯式的運(yùn)行時(shí)鏈接  ,(我用的是此方法)
            隱式鏈接雖然實(shí)現(xiàn)較簡(jiǎn)單,但除了必須的*.dll文件外還需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的場(chǎng)合就無(wú)法使用,而只能采用顯式鏈接的方式。這種方式通過(guò)調(diào)用API函數(shù)來(lái)完成對(duì)DLL的加載與卸載,其能更加有效地使用內(nèi)存,在編寫(xiě)大型應(yīng)用程序時(shí)往往采用此方式。這種方法編程具體實(shí)現(xiàn)步驟如下:
            ①使用Windows API函數(shù)Load Library或者M(jìn)FC提供的AfxLoadLibrary將DLL模塊映像到進(jìn)程的內(nèi)存空間,對(duì)DLL模塊進(jìn)行動(dòng)態(tài)加載。
            ②使用GetProcAddress函數(shù)得到要調(diào)用DLL中的函數(shù)的指針。
            ③不用DLL時(shí),用Free Library函數(shù)或者AfxFreeLibrary函數(shù)從進(jìn)程的地址空間顯式卸載DLL。
            例:在應(yīng)用程序中調(diào)用dll文件

            ——在應(yīng)用程序中要首先裝入dll后才能調(diào)用導(dǎo)出表中的函數(shù),例如用mfc

            創(chuàng)建基于對(duì)話(huà)框的工程test,并在對(duì)話(huà)框上放置"load"按鈕,先添加裝載代碼。
            1.首先在testdlg.cpp的首部添加變量設(shè)置代碼:

            //設(shè)置全局變量glibsample用于存儲(chǔ)dll句柄

            HINSTANCE  glibsample=null;   //如果定義成HANDLE類(lèi)型,則出錯(cuò)

            //第二個(gè)變量showme是指向dll
            庫(kù)中showme()函數(shù)的指針

            typedef int(* Showme)(void);

            Showme showme;

            2.利用classwizard為"load"按鈕添加裝載dll的代碼

            void ctestdlg::onloadbutton()

            {

            //要添加的代碼如下

            if(glibsample!=NULL)

            {

            AfxMessageBox("the sample.dll has already been load.");

            return;

            }

            //裝載sample.dll,未加路徑,將在三個(gè)默認(rèn)路徑中尋找 (1)windows的系統(tǒng)目錄:\windows\system;

            //(2)dos中path所指出的任何目錄;

            //(3)程序所在的目錄;


            glibsample=Loadlibrary("sample.dll");

            //返回dll中showme()函數(shù)的地址

            showme=(Showme)GetProcAddress(glibsample,"showme");

            posted @ 2010-12-27 13:15 wrh 閱讀(3673) | 評(píng)論 (0)編輯 收藏
            可利用SDK   API:GetAdaptersInfo以及GetIfEntry實(shí)現(xiàn)。  
                    GetAdaptersInfo返回系統(tǒng)中的所有網(wǎng)卡信息。  
                    GetIfEntry則返回制定網(wǎng)口的速率、狀態(tài)等信息。  
                    如果覺(jué)得將相關(guān)數(shù)據(jù)結(jié)構(gòu)改造到VB下很痛苦的話(huà),可編寫(xiě)一個(gè)短小的DLL完成網(wǎng)口檢測(cè)工作,并僅返回檢測(cè)結(jié)果即可。  
                    VC代碼:  
                    DWORD   dwOutBufLen=0;  
                     
                      PIP_ADAPTER_INFO   pAdapterInfo=NULL,pAdapter=NULL;  
                     
                      MIB_IFROW   zSNMP;  
                     
                      char   sTemp[20];  
                     
                      int   iReturn;          
                     
                      iReturn=GetAdaptersInfo(pAdapterInfo,&dwOutBufLen);  
                     
                      if(iReturn!=ERROR_BUFFER_OVERFLOW)  
                     
                      {  
                     
                      return   0;  
                     
                      }  
                               
                      pAdapterInfo   =(PIP_ADAPTER_INFO)   HeapAlloc(GetProcessHeap(),   0,   dwOutBufLen);  
                     
                      iReturn=GetAdaptersInfo(pAdapterInfo,&dwOutBufLen);  
                     
                      if(iReturn!=ERROR_SUCCESS)  
                     
                      {  
                     
                      HeapFree(GetProcessHeap(),   0,   pAdapterInfo);  
                     
                      return   0;  
                     
                      }  
                     
                      pAdapter=pAdapterInfo;  
                     
                     
                     
                      //find   if   there   is   ppp   adapter  
                     
                      while(pAdapter!=NULL   )  
                     
                      {  
                     
                      zSNMP.dwIndex   =   pAdapter-> Index;  
                     
                      iReturn=GetIfEntry(&zSNMP);  
                     
                      if(iReturn!=NO_ERROR)  
                     
                      return   0;  
                     
                     
                     
                      m_iIfSpeed=zSNMP.dwSpeed/(1000*1000);  
                     
                      m_iIfAdminStatus=zSNMP.dwAdminStatus;  
                     
                      m_iIfOperStatus=zSNMP.dwOperStatus;  
                     
                      …  
                     
                      pAdapter=pAdapter-> Next;  
                     
                      }
            posted @ 2010-12-17 11:26 wrh 閱讀(999) | 評(píng)論 (0)編輯 收藏
            #include <windows.h>
            #include <stdio.h>
            #include <iostream.h>
            #include "vfw.h"
            #pragma comment( lib, "vfw32.lib" )

            void main()
            {
              
                char strDeviceVersion[80];    //設(shè)備版本信息
                char strDeviceAndVersion[160];  //設(shè)備名和版本信息
                int nIndex;
                int nDriverCount = 0;                //支持的設(shè)備驅(qū)動(dòng)程序個(gè)數(shù)
              
              
                for(nIndex=0; nIndex <9; nIndex++)
                {
                    if(capGetDriverDescription(nIndex,(LPSTR)strDeviceAndVersion,sizeof(strDeviceAndVersion),(LPSTR)strDeviceVersion,sizeof(strDeviceVersion)))
                    {
                        strcat(strDeviceAndVersion,",");
                        strcat(strDeviceAndVersion,strDeviceVersion);
                        nDriverCount++;                  //得到vfw設(shè)備信息及連的設(shè)備數(shù)量
                    }
                    else
                        break;
                }
                if (nDriverCount==0)
                    cout <<"沒(méi)有攝像頭"<<endl;
                else
                    cout <<"有攝像頭"<<endl;
            }
            posted @ 2010-12-17 11:20 wrh 閱讀(1135) | 評(píng)論 (0)編輯 收藏

            經(jīng)常看見(jiàn)網(wǎng)上有人問(wèn)如何得到網(wǎng)線(xiàn)連上與拔出的狀態(tài),在這里介紹幾種方法,也許對(duì)大家會(huì)有所幫助

            第一種是通過(guò)OID進(jìn)行查詢(xún)的方法

             DWORD dwObj, dwStatus, dwBytesRet;
             dwOIDCode = OID_GEN_MEDIA_CONNECT_STATUS;
             DeviceIoControl(hAdapter, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwOIDCode, sizeof(dwOIDCode), &dwStatus,sizeof(dwStatus), &dwBytesRet, NULL); 
             printf("state is:%d\n",dwStatus);

            dwStatus=0表示連上了,1代表未連上

            但是經(jīng)過(guò)我的測(cè)試,好像這里的狀態(tài)并不是代表網(wǎng)線(xiàn)的,而是代表網(wǎng)絡(luò)可用與不可用,網(wǎng)線(xiàn)插上,網(wǎng)絡(luò)正在連接,這種狀態(tài)下的網(wǎng)絡(luò)是不可用的

            第二種是通過(guò)WMI進(jìn)行查詢(xún),WMI的功能很強(qiáng)大的

             while (pEnumerator)
             {
              HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
               &pclsObj, &uReturn);

              if(0 == uReturn)
              {
               break;
              }
              VARIANT vtProp;
              hr = pclsObj->Get(L"NdisMediaConnectStatus", 0, &vtProp, 0, 0);
              if (vtProp.bstrVal)
              {
               NdisMediaConnectStatus++;
              }
              VariantClear(&vtProp);
             }

            經(jīng)過(guò)測(cè)試,這種方法可以得到網(wǎng)線(xiàn)的狀態(tài),如果要實(shí)時(shí)得到網(wǎng)線(xiàn)的連接狀態(tài)的話(huà),可以開(kāi)線(xiàn)程,當(dāng)然資源充足的話(huà)也可以1秒查詢(xún)一次,但是這種方法在有多個(gè)網(wǎng)線(xiàn)的時(shí)候是不行的

            posted @ 2010-12-16 09:42 wrh 閱讀(2266) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共25頁(yè): 1 2 3 4 5 6 7 8 9 Last 

            導(dǎo)航

            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計(jì)

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            色欲av伊人久久大香线蕉影院| 色欲久久久天天天综合网精品| 久久久婷婷五月亚洲97号色| 亚洲日本va午夜中文字幕久久| 国产99久久久久久免费看| 九九精品99久久久香蕉| 亚洲国产精品无码久久久秋霞2 | 久久av免费天堂小草播放| 狠狠色丁香婷综合久久| 精品免费久久久久久久| 欧美牲交A欧牲交aⅴ久久| 久久综合给合久久狠狠狠97色| 久久AV无码精品人妻糸列| 青青草原综合久久大伊人| 亚洲?V乱码久久精品蜜桃 | 亚洲精品tv久久久久久久久| 亚洲中文久久精品无码ww16| 久久无码AV中文出轨人妻| 亚洲精品无码成人片久久| 欧美va久久久噜噜噜久久| 久久久久久国产精品免费无码| 国内精品伊人久久久久| 国产成人综合久久精品尤物| 久久青青国产| 久久精品国产99国产精品亚洲 | 久久ZYZ资源站无码中文动漫| 九九久久自然熟的香蕉图片| 久久综合欧美成人| 久久久无码精品午夜| 性欧美大战久久久久久久| 欧美黑人激情性久久| 久久精品国产亚洲AV电影| 久久亚洲精品中文字幕三区| 久久99精品国产99久久6| 久久精品亚洲AV久久久无码| 久久久精品人妻一区二区三区四| 久久久久久久尹人综合网亚洲| 欧美久久久久久午夜精品| 亚洲精品tv久久久久久久久| 久久久久久久尹人综合网亚洲| 国产精品中文久久久久久久|