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

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鍵盤和USB鼠標(biāo)全都枚舉出來(lái),這樣我就無(wú)法區(qū)分誰(shuí)是MP3,誰(shuí)是USB鍵盤和鼠標(biāo)了。雖然枚舉時(shí)我可以得到PID和VID,但是我們的PID和VID可能會(huì)被代理商更改,所以也就不能通過(guò)PID和VID來(lái)區(qū)分了,不知PC上的安全刪除U盤是怎樣做到的,PC應(yīng)該可以將盤符和對(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 閱讀(984) | 評(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 閱讀(343) | 評(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 閱讀(1997) | 評(píng)論 (0)編輯 收藏

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

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

 if(m_bOnline)//在線  
{  
          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("在線:撥號(hào)上網(wǎng)");  
                  break;  
          case   INTERNET_CONNECTION_LAN   :  
                  AfxMessageBox("在線:通過(guò)局域網(wǎng)");  
                  break;  
          case   INTERNET_CONNECTION_PROXY   :  
                  AfxMessageBox("在線:代理");  
                  break;  
          }  
          if(flags&INTERNET_CONNECTION_MODEM_BUSY==INTERNET_CONNECTION_MODEM_BUSY)  
                  AfxMessageBox("MODEM被其他非INTERNET連接占用");  
}  
else  
              AfxMessageBox("不在線");

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

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

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

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

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


詳細(xì)說(shuō)明:
雖然MSDN中定義了7種參數(shù)類型,但實(shí)際中wininet.h頭文件中只對(duì)四種類型的值進(jìn)行了定義
7種類型:
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     離線
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 閱讀(764) | 評(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ù),該屬性僅將序號(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)而不是按名稱從 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)行名稱修飾。

如果需要將修飾名放到 .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 閱讀(663) | 評(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ì)話框,在對(duì)話框的多頁(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);稱為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ǔ)類。當(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è)將要稱為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)用程序訪問(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)容有詳盡解釋,請(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ù)類型:是一個(gè)實(shí)例的句柄;在此情況下,這個(gè)實(shí)例將是這個(gè)DLL。你可以通過(guò)使用函數(shù)LoadLibrary()獲得DLL的實(shí)例,它獲得一個(gè)名稱作為參數(shù)。在調(diào)用LoadLibrary函數(shù)后,你必需查看一下函數(shù)返回是否成功。你可以通過(guò)檢查HINSTANCE是否等于NULL(在Windows.h中定義為0或Windows.h包含的一個(gè)頭文件)來(lái)查看其是否成功。如果其等于NULL,該句柄將是無(wú)效的,并且你必需釋放這個(gè)庫(kù)。換句話說(shuō),你必需釋放DLL獲得的內(nèi)存。如果函數(shù)返回成功,你的HINSTANCE就包含了指向DLL的句柄。

一旦你獲得了指向DLL的句柄,你現(xiàn)在可以從DLL中重新獲得函數(shù)。為了這樣作,你必須使用函數(shù)GetProcAddress(),它將DLL的句柄(你可以使用HINSTANCE)和函數(shù)的名稱作為參數(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í)際名稱;你必需使用函數(shù)指針來(lái)調(diào)用它們。在那以后,所有你需要做的是釋放庫(kù)如此而已。

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

posted @ 2010-12-28 13:47 wrh 閱讀(450) | 評(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ì)話框,在對(duì)話框的多頁(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文件映像到用戶進(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文件的名稱,試圖加載這個(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ì)話框中選中要加入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ì)話框的工程test,并在對(duì)話框上放置"load"按鈕,先添加裝載代碼。
1.首先在testdlg.cpp的首部添加變量設(shè)置代碼:

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

HINSTANCE  glibsample=null;   //如果定義成HANDLE類型,則出錯(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 閱讀(3703) | 評(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下很痛苦的話,可編寫(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 閱讀(1022) | 評(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 閱讀(1146) | 評(píng)論 (0)編輯 收藏

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

第一種是通過(guò)OID進(jì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)線的,而是代表網(wǎng)絡(luò)可用與不可用,網(wǎng)線插上,網(wǎng)絡(luò)正在連接,這種狀態(tài)下的網(wǎng)絡(luò)是不可用的

第二種是通過(guò)WMI進(jì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)線的狀態(tài),如果要實(shí)時(shí)得到網(wǎng)線的連接狀態(tài)的話,可以開(kāi)線程,當(dāng)然資源充足的話也可以1秒查詢一次,但是這種方法在有多個(gè)網(wǎng)線的時(shí)候是不行的

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

導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計(jì)

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产成人av好男人在线观看| 一本大道久久a久久精二百| 国产视频精品免费播放| 欧美午夜精品理论片a级按摩 | 亚洲电影自拍| 久久综合色播五月| 男女视频一区二区| 欧美不卡三区| 欧美日韩国产综合一区二区| 欧美视频一区二| 国产日韩亚洲欧美综合| 在线观看亚洲视频| 亚洲精品一线二线三线无人区| 一区二区欧美亚洲| 午夜视频久久久久久| 久久久伊人欧美| 91久久黄色| 亚洲欧美激情四射在线日| 久久看片网站| 欧美日韩一区二区欧美激情| 国产日产欧美精品| 欧美日本簧片| 日韩亚洲成人av在线| 9i看片成人免费高清| 亚洲一区欧美二区| 久久久99国产精品免费| 国产日韩欧美麻豆| 国产一区二区黄色| 亚洲精品日产精品乱码不卡| 亚洲欧美激情精品一区二区| 久久综合狠狠综合久久综合88| 久久婷婷成人综合色| 亚洲精品欧美专区| 午夜精品久久久久久久久久久久| 翔田千里一区二区| 久久这里只精品最新地址| 欧美吻胸吃奶大尺度电影| 韩日成人在线| 国产综合久久久久影院| 久久婷婷丁香| 久久精品2019中文字幕| 日韩视频在线观看国产| 欧美怡红院视频| 亚洲精品国产精品国自产观看| 亚洲欧美国产日韩中文字幕| 欧美人成在线| 亚洲免费福利视频| 久久五月婷婷丁香社区| 亚洲欧美一区二区在线观看| 欧美日韩黄视频| 91久久国产综合久久91精品网站| 久久激情视频久久| 亚洲午夜av在线| 欧美日韩岛国| 久久精品国产久精国产一老狼 | 久久久伊人欧美| 欧美深夜影院| 日韩亚洲不卡在线| 女人天堂亚洲aⅴ在线观看| 欧美一区二区视频在线观看| 久久综合伊人| 欧美一级大片在线免费观看| 欧美小视频在线| 亚洲视频碰碰| 在线一区免费观看| 国产精品免费福利| 欧美在线网址| 久久精品电影| 欧美日韩一区二区三区在线观看免 | 亚洲乱码一区二区| 欧美大片免费看| 亚洲国产精品日韩| 欧美国产日本韩| 欧美a级一区| 99视频精品免费观看| 亚洲国产一区二区三区在线播| 欧美韩日一区二区| 久久久99久久精品女同性| 国产一级一区二区| 久久综合九色综合欧美就去吻| 久久人体大胆视频| 亚洲毛片视频| 亚洲婷婷免费| 国产一区二区在线观看免费播放| 久久久久se| 欧美成人在线免费观看| 一区二区三区国产精华| 亚洲一区欧美| 亚洲国产综合视频在线观看| 亚洲视频欧洲视频| 噜噜噜在线观看免费视频日韩| 亚洲精品老司机| 亚洲视频欧洲视频| 1000部国产精品成人观看| 亚洲人成网站在线播| 国产精品国产馆在线真实露脸| 久久精品日产第一区二区| 久久在线播放| 午夜精品国产精品大乳美女| 久久av一区二区| 亚洲线精品一区二区三区八戒| 欧美一区二区三区四区在线观看地址 | 乱中年女人伦av一区二区| 欧美成年人视频网站欧美| 亚洲欧美日韩精品久久久久| 香蕉久久精品日日躁夜夜躁| 亚洲国产日韩一级| 亚洲欧美激情在线视频| 亚洲国产精品ⅴa在线观看 | 欧美国产日韩二区| 欧美一级欧美一级在线播放| 免费成人高清视频| 亚洲影院色无极综合| 久久综合亚洲社区| 亚洲一区二区三区精品在线观看| 欧美在线国产精品| 一本久久综合亚洲鲁鲁五月天| 欧美在线观看网址综合| 亚洲视频在线看| 欧美大尺度在线| 蜜桃久久精品一区二区| 国产精品久久网| 亚洲毛片av在线| 鲁大师影院一区二区三区| 亚洲人成网站在线观看播放| 国内免费精品永久在线视频| 一区二区三区.www| 一本色道久久加勒比88综合| 久久夜色精品国产噜噜av| 香蕉精品999视频一区二区| 欧美男人的天堂| 亚洲第一精品在线| 在线看国产日韩| 久久先锋资源| 欧美成人亚洲成人日韩成人| 海角社区69精品视频| 牛人盗摄一区二区三区视频| 欧美片第一页| 激情av一区二区| 最新国产成人在线观看| 欧美激情国产日韩精品一区18| 麻豆精品视频在线| 免费成人小视频| 一区二区视频免费在线观看| 久久激情中文| 免费的成人av| 亚洲人被黑人高潮完整版| 久久综合狠狠综合久久激情| 免费日韩成人| 亚洲电影第三页| 欧美国产成人在线| 亚洲开发第一视频在线播放| 亚洲午夜激情网页| 国产精品豆花视频| 香蕉av福利精品导航| 久久综合九色综合网站| 影音先锋中文字幕一区二区| 欧美成人精品h版在线观看| 亚洲黑丝一区二区| 亚洲自拍偷拍麻豆| 国内精品伊人久久久久av影院 | 国产日韩在线看| 久久美女艺术照精彩视频福利播放| 欧美成人午夜激情| 在线综合亚洲| 亚洲性感美女99在线| 久久久国产精品一区| 亚洲国产清纯| 欧美日韩一区二区三区免费 | 激情欧美丁香| 在线亚洲国产精品网站| 久久免费国产精品1| 亚洲电影天堂av| 亚洲欧美激情在线视频| 激情成人av在线| 欧美日韩国产三级| 午夜久久久久久久久久一区二区| 久热精品在线| 欧美高清不卡在线| 久久久亚洲高清| 国产精品久久久久久久久动漫 | 欧美高清在线观看| 日韩亚洲视频在线| 国产欧美日韩三区| 欧美顶级少妇做爰| 欧美呦呦网站| 日韩视频免费观看高清在线视频 | 91久久国产精品91久久性色| 亚洲欧美日韩在线高清直播| 在线高清一区| 国产麻豆精品久久一二三| 欧美成人亚洲成人日韩成人| 午夜在线精品偷拍| 亚洲精品一区二区三区福利 | 亚洲欧美视频一区| 亚洲乱码国产乱码精品精可以看| 麻豆久久久9性大片| 香蕉久久夜色精品国产使用方法| 亚洲精品乱码久久久久久日本蜜臀| 国产日韩三区|