日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

win32 DLL 学习总结

發(fā)布時(shí)間:2025/4/14 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 win32 DLL 学习总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DLL的開發(fā)與調(diào)用(一)——?jiǎng)?chuàng)建導(dǎo)出函數(shù)的Win32 DLL

http://www.cnblogs.com/Pickuper/articles/2053745.html

Visual C++6.0 中可實(shí)現(xiàn)的DLL

? ? ? ? ?Visual C++6.0 支持自動(dòng)生成Win32 DLL和MFC AppWizard DLL兩種,其中Win32 DLL不使用MFC類庫,其導(dǎo)出的函數(shù)是標(biāo)準(zhǔn)的C接口,能夠被非MFC和MFC的應(yīng)用程序調(diào)用,應(yīng)用范圍更廣泛。所以下面就介紹Win32 DLL的開發(fā)。

創(chuàng)建導(dǎo)出函數(shù)的Win32 DLL
1、啟動(dòng)Visual C++6.0,利用AppWizard創(chuàng)建一個(gè)“Win32 Dynamic-Link Library”類型的工程,工程名為SayHello。采用默認(rèn)設(shè)置,即創(chuàng)建一個(gè)Win32 DLL的空項(xiàng)目。
2、為DLL工程添加頭文件SayHello.h和源文件SayHello.cpp。在頭文件SayHello.h中,聲明DLL的導(dǎo)出函數(shù)Say和Sum,分別用來顯示"Hello,World!"和求和。聲明代碼如下:

//SayHello.h
//
/*
extern "C"修飾詞的作用是使C++編譯器以C語言的方式對(duì)這個(gè)函數(shù)進(jìn)行處理,以便供其他語言所用。
*/
extern "C" void _declspec(dllexport)Say(char* szWords,int nLen); ? ? ? ? ? ? ? ? ? ? ? ? ? //聲明Say導(dǎo)出函數(shù)
extern "C" float _declspec(dllexport)Sum(float fNum1,float fNum2); ? //聲明Sum導(dǎo)出函數(shù)
在源文件SayHello.cpp中添加函數(shù)Say和Sum的實(shí)現(xiàn)代碼,代碼如下:

//SayHello.cpp
//
#include <string.h>
#include "SayHello.h"

void Say(char* szWords,int nLen)
{
? ? strcpy(szWords,"Hello,World!");
? ? strcat(szWords,"\0");
}

float Sum(float fNum1,float fNum2)
{
? ? return fNum1+fNum2;
}
3、【F7】鍵編譯生成DLL。此時(shí)在工程的Debug文件夾下生成實(shí)際代碼文件SayHello.dll和導(dǎo)入庫文件SayHello.lib。
4、從DLL中導(dǎo)出函數(shù)有兩種方法,一種是使用_declspec(dllexport)關(guān)鍵字,如SayHello.h中所示;一種是添加.def文件(值得注意的是,添加的文件類型是文本文件,且名稱應(yīng)輸入SayHello.def),代碼如下:

;SayHello.def
;

LIBRARY "SayHello"
DESCRIPTION "導(dǎo)出DLL中的函數(shù)"
EXPORTS
? ? Say ?@1
? ? Sum ?@2
5、加載DLL分為靜態(tài)加載和動(dòng)態(tài)加載。動(dòng)態(tài)加載(運(yùn)行時(shí)動(dòng)態(tài)鏈接,也叫顯示鏈接)DLL是通過LoadLibrary、GetProcAddress和FreeLibrary這3個(gè)API函數(shù)進(jìn)行的。調(diào)用如下:

typedef void(*SAY)(char*,int);
SAY Say;
typedef float(*SUM)(float,float);
SUM Sum;
HINSTANCE hdll;
hdll=LoadLibrary("..\\..\\SayHello\\Debug\\SayHello.dll");
if(hdll!=NULL)
{
? ? //GetProcAddress函數(shù)獲得獲得獲得DLL導(dǎo)出函數(shù)地址
? ? Say=(SAY)GetProcAddress(hdll,"Say");
? ? Sum=(SUM)GetProcAddress(hdll,"Sum");
}
else
{
? ? AfxMessageBox("無法加載DLL!");
? ? return;
}
UpdateData(TRUE);
const int Len=20;
char p[Len];
Say(p,Len);
m_strDispHello.Format("%s",p);
m_fResult=Sum(m_fNum1,m_fNum2);
UpdateData(FALSE);
FreeLibrary(hdll);
靜態(tài)加載(加載時(shí)動(dòng)態(tài)鏈接,也叫隱式鏈接)DLL是由編譯系統(tǒng)完成對(duì)DLL的加載和應(yīng)用程序結(jié)束時(shí)對(duì)DLL的卸載,需要將DLL的引用庫文件(.lib)與應(yīng)用程序進(jìn)行靜態(tài)鏈接。調(diào)用如下:
#pragma comment(lib,"SayHello.lib")
extern "C" _declspec(dllimport) void Say(char* szWords,int nLen);?
extern "C" _declspec(dllimport) float Sum(float fNum1,float fNum2);
此時(shí)就使用Say和Sum函數(shù)了。
========

Win32 動(dòng)態(tài)鏈接(dll)簡單示例

http://blog.csdn.net/weiwenhp/article/details/8710811

dll(dynamic link library)動(dòng)態(tài)鏈接庫相當(dāng)于是把一些函數(shù)或者類啊編譯成源碼.不過它不可執(zhí)行.只是當(dāng)被其他exe或dll調(diào)用到時(shí)才被加載到內(nèi)存中.像windows那些API都是放到一些dll文件中.比如kernel32.dll,它包含管理內(nèi)存,進(jìn)程,線程的一些函數(shù).User32.dll包含用于執(zhí)行用戶界面任務(wù)的函數(shù).

而當(dāng)我們寫代碼要用到dll中的函數(shù)時(shí),在編譯階段一般只要個(gè)lib文件,里面有dll中的函數(shù)和類的描述信息,但沒有實(shí)現(xiàn)代碼信息.

DLL的創(chuàng)建
下面來看一個(gè)創(chuàng)建dll的簡單示例
創(chuàng)建 Win32 Project-->application type選DLL.
project名字就取DllTest.創(chuàng)建好項(xiàng)目后我們會(huì)看到自動(dòng)生成了.dllmain.cpp和DllTest.cpp,前一個(gè)文件不用去動(dòng)它.
我們就在DllTest.cpp文件中添加如下內(nèi)容

_declspec(dllexport) int multiply(int one , int two) //返回兩數(shù)相乘的積 { return one*two; }
編譯下這個(gè)項(xiàng)目.你會(huì)在目錄下面看到DllTest.dll 和 DllTest.lib 這兩文件.等會(huì)其他項(xiàng)目中要用它倆.

DLL的使用
新建一個(gè)簡單的Win32 console application 項(xiàng)目.把上面的DllTest.dll和DllTest.lib兩文件拷到項(xiàng)目目錄下.再添加如下代碼

#include <iostream> using namespace std; #pragma comment(lib, "./DllTest.lib") int multiply( int one , int two) ; //函數(shù)聲明,函數(shù)定義最終是去調(diào)用DllTest.dll中的代碼了.//另外最好是寫成這樣_declspec(dllimport) int multiply( int one , int two) int main() {int ret = multiply( 4,5);cout<<ret; //20return 0; }
當(dāng)然了,如果你嫌#pragma comment(lib, "./DllTest.lib")這樣寫麻煩,也不不寫,而是在項(xiàng)目的property page -->Linker -->Input -->Additional Dependencies里面敲入DllTest.lib

Dll創(chuàng)建示例2(帶類的dll)
上面是比較簡單的再來看個(gè)復(fù)雜點(diǎn)的.

跟前面一樣還是一樣先創(chuàng)建一個(gè)win32 dll項(xiàng)目名為DllTest.然后添加class Arwen.

/Arwen.h中內(nèi)容/
#pragma once
#include <iostream>
#define DLL_API _declspec(dllimport)
class DLL_API Arwen{
public:
int age;
void Fun();
};
?
//Arwen.cpp中內(nèi)容/
#include "StdAfx.h"
#include "Arwen.h"
#define DLL_API _declspec(dllexport)
void Arwen::Fun()
{
std::cout<<"my age is "<<age;
}?

使用DLL

新建一個(gè)win32 console application ,把DllTest.dll和Dll.lib拷貝過去.另外把頭文件Arwen.h也拷過去.

#include "Arwen.h"
#pragma comment(lib, "./DllTest.lib")
int main()
{
Arwen an;
an.age = 25;
an.Fun();
?return 0;
}

?動(dòng)態(tài)加載DLL
前面講的是靜態(tài)加載DLL,現(xiàn)在瞧下怎么動(dòng)態(tài)加載.

#include <windows.h>

typedef int( *pFun) (int a, int b); ?//定義一個(gè)函數(shù)指針類型

void main()

{

? HINSTANCE hInt = LoalLibrary( _T( "../debug/DllTest.dll") ); ?//動(dòng)態(tài)加載

? pFun mulitplyFun = (pFun) GetProcAddress( hInt , (LPCSTR) MAKEINTRESOURCE(2)); //函數(shù)序列號(hào)是通過工具dumpbin查到的

}?

工具dumpbin的使用.

1.先找到vsvar32.bat文件,目錄是在: 安裝目錄\VC\bin\vcvars32.bat.然后在cmd里面執(zhí)行它

2.先切換到dll文件所在目錄,假如這里是DllTest.dll,然后執(zhí)行命令dumpbin - exports DllTest.dll

3.得到所以導(dǎo)出函數(shù)信息,其中ordianl那一列指函數(shù)序列號(hào) , name那一列則是編譯之后函數(shù)的名字,比之前的函數(shù)名多了些前綴后綴.
========

win32 dll簡單例子


http://blog.csdn.net/rem2002/article/details/1744978
一。顯示鏈接dll

編寫dll

FILE->Visal C++項(xiàng)目: Win32項(xiàng)目->應(yīng)用程序設(shè)置: 選擇 DLL(D) 選項(xiàng) 并勾選 導(dǎo)出符號(hào),將 h,cpp文件修改如下:

MyDll.h

? ?//Mydll.h
? ?#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

extern "C" MYDLL_API int fun(int mode); //自己寫的 extern "C" 不可少
extern "C" MYDLL_API int fun2(int a,int b);?

MyDll.cpp

#include "stdafx.h"
#include "MyDll.h"
BOOL APIENTRY DllMain( HANDLE hModule,?
? ? ? ? ? ? ? ? ? ? ? ?DWORD ?ul_reason_for_call,?
? ? ? ? ? ? ? ? ? ? ? ?LPVOID lpReserved
? ? ? ? ? ? ? ? ? ? ?)
{
? ? switch (ul_reason_for_call)
? ? {
? ? case DLL_PROCESS_ATTACH:
? ? case DLL_THREAD_ATTACH:
? ? case DLL_THREAD_DETACH:
? ? case DLL_PROCESS_DETACH:
? ? ? ? break;
? ? }
? ? return TRUE;
}

MYDLL_API int fun(int mode) //自己寫的
{
? ??
? ? return mode*mode;
}

MYDLL_API int fun2(int a,int b) //自己寫的
{
? ? int d = (a>b?(a-b):(b-a));
? ? return d;
}
編寫測(cè)試程序:testDll

采用win32控制臺(tái)生成的執(zhí)行程序進(jìn)行測(cè)試 (注: 屬性->C/C++:預(yù)處理器->預(yù)處理器定義 ?加宏:MYDLL_EXPORTS)
因?yàn)镸yDll.h中定義了宏 #define MYDLL_API __declspec(dllexport)

#include <iostream>
#include <Windows.h>

typedef int (*PFNMYDLL)(int);//聲明函數(shù)原型
typedef int (*HHH)(int,int);?

using namespace std;

void main()
{
? ? HMODULE hModule = ::LoadLibrary("MyDll.dll");//加載DLL庫

? ? PFNMYDLL newfun = (PFNMYDLL)::GetProcAddress(hModule,"fun");//取得fun函數(shù)的地址

? ? int i = newfun(4);
? ? printf("The result is %d ",i);

? ? HHH newfun2 = (HHH)::GetProcAddress(hModule,"fun2");//取得fun函數(shù)的地址

? ? int d = newfun2(6,4);
? ? printf("the 6,4 is: %d ",d);


? ? int c = newfun2(7,19);
? ? printf("the 7,19 is:%d ",c);


? ? ::FreeLibrary(hModule);
}
?
二.隱式鏈接


[cpp] view plain copy
#ifdef MYDLL_EXPORTS ?
#define MYDLL_API __declspec(dllexport) ?
#else ?
#define MYDLL_API __declspec(dllimport) ?
#endif ?
??
class MYDLL_API MyDll ?
{ ?
public: ?
? ? MyDll(void); ?
? ? ~MyDll(void); ?
? ? void setValue(int value); ?
? ? int getValue(); ?
??
private: ?
? ? int m_nValue; ?
}; ?
?
?使用 dll 代碼


[cpp] view plain copy
#include <stdlib.h> ?
#include <stdio.h> ?
#include <windows.h> ?
#include "MyDll.h" ?
#pragma comment(lib,"MyDll.lib") ?
??
void main() ?
{ ?
??
?MyDll myDll; ?
?myDll.setValue(20); ?
?int i = myDll.getValue(); ?
??
?printf("%d",i); ?
} ?
?
?以下為轉(zhuǎn)貼


三。導(dǎo)出并顯式鏈接一組C++成員函數(shù)


這里有兩個(gè)問題。第一是C++成員函數(shù)名是經(jīng)過修飾的(即使指定extern "C"標(biāo)記也是這樣);第二是C++不允許將指向成員函數(shù)的指針轉(zhuǎn)換成其它類型。這兩個(gè)問題限制了C++類的顯式鏈接。下面介紹兩種方法來解決這個(gè)問題:①用虛函數(shù)表的方法,這也是COM使用的方法;②用GetProcAddress直接調(diào)用。


1.虛函數(shù)表方法:


使用到的 dll 頭文件 MyDll.h


[cpp] view plain copy
#ifdef MYDLL_EXPORTS ?
#define MYDLL_API __declspec(dllexport) ?
#else ?
#define MYDLL_API __declspec(dllimport) ?
#endif ?
??
class MYDLL_API MyDll ?
{ ?
public: ?
? ? MyDll(void); ?
? ? MyDll(int i); ?
? ? virtual ~MyDll(void); ?
? ? virtual void setValue(int value); ?
? ? virtual int getValue(); ?
??
private: ?
? ? int m_nValue; ?
}; ?
?
使用 dll 的代碼


[cpp] view plain copy
#include <stdlib.h> ?
#include <stdio.h> ?
#include <string> ?
#include <windows.h> ?
??
#include "MyDll.h" ?
??
typedef MyDll* (*pCreateA)(); ?
typedef MyDll* (*pCreateA1)(int); ?
??
void main() ?
{ ?
? ? HMODULE hModule; ?
? ? ??
? ? hModule = ::LoadLibrary("MyDll");//加載DLL庫 ?
??
? ? pCreateA pCreate = (pCreateA)GetProcAddress(hModule, TEXT("CreateMyDll")); ?
??
? ? MyDll* a = (pCreate)(); ?
? ? a->setValue(20); ?
? ? printf("one:%d/n",a->getValue()); ? ?
??
? ? pCreateA1 pCreate1 = (pCreateA1)GetProcAddress(hModule, TEXT("CreateMyDll1")); ?
??
? ? MyDll* b = (pCreate1)(50); ?
? ? printf("two:%d/n",b->getValue()); ?
??
? ? ::FreeLibrary(hModule); ?
??
? ? getchar(); ?
? ? return; ?
} ??


dll 項(xiàng)目


MyDll.h 即使用到的 dll 頭文件


MyDll.cpp


[cpp] view plain copy
#include "MyDll.h" ?
??
MyDll::MyDll(void) ?
:m_nValue(0) ?
{ ?
} ?
??
MyDll::MyDll(int i) ?
{ ?
? ? m_nValue = i; ?
} ?
??
MyDll::~MyDll(void) ?
{ ?
? ? m_nValue = 0; ?
} ?
??
void MyDll::setValue(int value) ?
{ ?
? ? m_nValue = value; ?
} ?
??
int MyDll::getValue() ?
{ ?
? ? return m_nValue; ?
} ?
Inst.cpp


[c-sharp] view plain copy
#include "MyDll.h" ?
??
extern "C" __declspec(dllexport) MyDll* CreateMyDll() ?
{ ?
? ? return new MyDll(); ?
} ?
extern "C" __declspec(dllexport) MyDll* CreateMyDll1(int i) ?
{ ?
? ? return new MyDll(i); ?
} ?
?
這個(gè)方法的使用得用戶可以很容易地為你的程序制作插件。它的缺點(diǎn)是創(chuàng)建對(duì)象的內(nèi)存必須在dll中分配.


直接使用GetProcAddress進(jìn)行顯式鏈接


這個(gè)方法的關(guān)鍵在于將GetProcAddress函數(shù)返回的FARPROC類型轉(zhuǎn)化為C++中指向成員函數(shù)的指針。幸運(yùn)的是,通過C++的unio和模板機(jī)制,這個(gè)目標(biāo)可以很容易地實(shí)現(xiàn)。我們要做的只是定義如下的函數(shù):


template<class Src , class Dest>


Dest force_cast(Src src){


?union{


? Dest d;


? Src s;


?} convertor;


convertor.s = Src;


?return convertor.d;


}


上面的函數(shù)允許我們?cè)谌魏晤愋烷g進(jìn)行轉(zhuǎn)換,比reinterpret_cast更加有效。例如,我們定義一種指針類型:


typedef void (A::*PSetNum)(int);


我們可以將FARPROC類型的指針fp轉(zhuǎn)化成PSetNum:


PSetNum psn = force_cast<PSetNum>(fp);


找到了將FARPROC轉(zhuǎn)化成成員函數(shù)指針的方法以后,我們要考慮如何將C++成員函數(shù)以更加友好的名字導(dǎo)出。這可以通過一個(gè).def文件來實(shí)現(xiàn)。


第一步是找到待導(dǎo)出函數(shù)經(jīng)過修飾的函數(shù)名,這可以通過查看map file或者匯編代碼來實(shí)現(xiàn)。然后在.def文件中指定導(dǎo)出函數(shù)的新的函數(shù)名:


EXPORTS


?ConstructorOfA1 = ??0A@@QAE@XZ ? ? ? ?PRIVATE


?ConstructorOfA2 = ??0A@@QAE@H@Z ? ? ? PRIVATE


?SetValueOfA ? ? ? = ?SetNum@A@@UAEXH@Z ?PRIVATE


?GetValueOfA ? ? ? = ?GetNum@A@@UAEHXZ ? PRIVATE ?


下面是調(diào)用這些成員函數(shù)的方法:


typedef void (A::*PfnConstructorOfA1)();


typedef void (A::*PfnConstructorOfA2)(int);


typedef void (A::*PfnDestructorOfA)();


typedef void (A::*PfnSetNumOfA)(int);


typedef int ?(A::*PfnGetNumOfA)();


A* a1 = (A*)_alloca(sizeof(A));


PfnConstructorOfA1 pfnConsA =


? ? ?force_cast<PfnConstructorOfA1>(GetProcAddress(hMod, TEXT("ConstructorOfA1")));


(a1->*pfnConsA)();


PfnSetNumOfA pfnSetNumA =


? ? ? ? ? force_cast<PfnSetNumOfA>(GetProcAddress(hMod, TEXT("SetNumOfA")));


(a1->*pfnSetNumA)(1); ? ??


PfnGetNumOfA pfnGetNumA =


? ? ? ? ? force_cast<PfnGetNumOfA>(GetProcAddress(hMod, TEXT("GetNumOfA")));


_tprintf(TEXT("Value of m_nNum in a is %d/n"),(a1->*pfnGetNumA)());


?注意這里使用了alloca從棧中分配內(nèi)存,你也可以使用malloc從堆中分配內(nèi)存。但是不能使用C++的new操作符,因?yàn)槟苓^new來分配內(nèi)存編譯器會(huì)自動(dòng)插入對(duì)constructor的調(diào)用。但我們要的是顯式鏈接,所以必須避免這種情況。隨之產(chǎn)生的結(jié)果是我們只能顯式地去調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。
========

動(dòng)態(tài)鏈接庫-Win32 DLL的創(chuàng)建和使用

http://www.cnblogs.com/because/archive/2012/02/18/2357109.html
摘要
? ? ? ?利用Visual C++6.0創(chuàng)建和使用DLL(Dynamic-Link Library).


概述
   在實(shí)際編程時(shí),我們可以把完成某種功能的函數(shù)放在一個(gè)動(dòng)態(tài)鏈接庫中,然后給其他程序調(diào)用。


   WinAPI中所有的函數(shù)都包含在3個(gè)最重要的DLL中。


Kernel32.dll
        它包含那些用于管理內(nèi)存、進(jìn)程和線程的函數(shù),例如CreateThread函數(shù);


User32.dll
        它包含那些用于執(zhí)行用戶界面任務(wù)的函數(shù),例如CreateWindow函數(shù);


GDI32.dll   
        它包含那些用于畫圖和顯示文本的函數(shù)。


用法 
?新建一個(gè)Win32 Console Application工程:


以MathLib為工程名稱新建Win32 Dynamic-Link Library的空工程,


添加C++ Source File 源文件到工程中,命名為MathLib.c


添加以下代碼:


復(fù)制代碼
?1 #define MATH_API _declspec(dllexport)
?2 #include "MathLib.h"
?3 int add(int a,int b)
?4 {
?5 ? ? return a+b;
?6 }
?7 int subtract(int a,int b)
?8 {
?9 ? ? return a-b;
10 }
復(fù)制代碼
添加C/C++ Header File 頭文件到工程中,命名為MathLib.h


復(fù)制代碼
1 #ifdef MATH_API
2 #else
3 ? ? #define ? MATH_API _declspec(dllimport)
4 #endif
5 MATH_API int add(int a,int b);
6 MATH_API int subtract(int a,int b);
復(fù)制代碼
編譯后生成MathLib.dll和MathLib.lib兩個(gè)動(dòng)態(tài)鏈接庫文件。


測(cè)試
隱式調(diào)用
?
新建MFC AppWizard[exe]可執(zhí)行工程DllTest,用于測(cè)試剛才新建動(dòng)態(tài)鏈接庫MathLib的功能。


復(fù)制MathLib.dll,MathLib.lib,MathLib.h到當(dāng)前工程,


在DllTestDlg.cpp中添加頭文件引用:


#include "MathLib.h"
?
添加MathLib.h頭文件至工程,


在Project->Setting->Link->object/library modules:添加MathLib.lib


添加一個(gè)按鈕Add到Dialogue中,在Add按鈕的響應(yīng)函數(shù)中添加以下代碼:


1 void CDllTestDlg::OnBtnMath()?
2 {
3 ? ? // TODO: Add your control notification handler code here
4 ? ? CString res;
5 ? ? res.Format("10+2=%d",add(10,2));
6 ? ? MessageBox(res);
7 }
復(fù)制代碼
編譯運(yùn)行程序,


成功運(yùn)行MathLib中的加法功能。


工程文件:
========

windows程序設(shè)計(jì)之調(diào)用動(dòng)態(tài)鏈接庫DLL DLL的調(diào)用約定

http://www.cnblogs.com/llz5023/archive/2012/12/30/2839682.html
1、動(dòng)態(tài)鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動(dòng)態(tài)鏈接提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個(gè) DLL 中,該 DLL 包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開存儲(chǔ)的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個(gè)應(yīng)用程序可同時(shí)訪問內(nèi)存中單個(gè)DLL 副本的內(nèi)容。DLL 是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫。


2、操作實(shí)例,C語言咧調(diào)用系統(tǒng)的kernel32.dll中的GlobalMemoryStatusEx函數(shù)


? ? ? ? ? ?typedef ? void(WINAPI* ? FunctionGlobalMemoryStatusEx)(LPMEMORYSTATUS);//聲明函數(shù)指針模型
? ? ? ? ? ? HMODULE ? hModule;//Dll句柄
? ? ? ? ? ? FunctionGlobalMemoryStatusEx ? GlobalMemoryStatusEx;//函數(shù)指針模型聲明函數(shù)變量
? ? ? ? ? ? MEMORYSTATUS status;
? ? ? ? ? ? status.dwLength = sizeof(status);
? ? ? ? ? ? //GlobalMemoryStatus(&status);
? ? ? ? ? ? hModule ? = ? LoadLibrary("kernel32.dll");//調(diào)試時(shí)hModule為0x10000000,載入動(dòng)態(tài)鏈接庫dll,返回它的句柄
? ? ? ? ? ? if(NULL==hModule)//判斷載入是否成功
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //error.
? ? ? ? ? ? ? ? MessageBox(hwndDlg,TEXT("載入指定的動(dòng)態(tài)鏈接庫dll失敗"),TEXT("error"),MB_OK);
? ? ? ? ? ? ? ? return 0;
? ? ? ? ? ? }
? ? ? ? ? ? //調(diào)用GetProcAddress API根據(jù)dll句柄,和dll的聲明的函數(shù)名獲取函數(shù)指針
? ? ? ? ? ? GlobalMemoryStatusEx ? =(FunctionGlobalMemoryStatusEx)GetProcAddress(hModule,"GlobalMemoryStatusEx");
? ? ? ? ? ? if(NULL==GlobalMemoryStatusEx)//判斷獲取是否成功
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //error
? ? ? ? ? ? ? ? MessageBox(hwndDlg,TEXT("error2"),TEXT("error2"),MB_OK);
? ? ? ? ? ? ? ? return 0;
? ? ? ? ? ? }
? ? ? ? ? ? //獲取成功,然后可以直接用函數(shù)指針來調(diào)用函數(shù),函數(shù)名就是函數(shù)指針,C語言應(yīng)該都懂
? ? ? ? ? ? GlobalMemoryStatusEx(&status);//調(diào)用函數(shù)
? ? ? ? ? ? FreeLibrary(hModule);//用完了要釋放dll
3、第二步已經(jīng)說名了怎么動(dòng)態(tài)調(diào)用DLL,我們還要注意一點(diǎn),DLL的調(diào)用約定
dll有__cdecl __stdcall WINAPI 等不同的調(diào)用約定,也就是參數(shù)的壓棧順序等,暫時(shí)不用關(guān)心,只要保證調(diào)用的時(shí)候和dll中的調(diào)用約定一樣就可以。
//否則會(huì)報(bào)錯(cuò):The value of ESP was not properly saved across a function call. ?This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.?
如上面的列子,如果我把typedef ? void(WINAPI* ? FunctionGlobalMemoryStatusEx)(LPMEMORYSTATUS);//聲明函數(shù)指針模型,改成:
typedef ? void(__cdecl* ? FunctionGlobalMemoryStatusEx)(LPMEMORYSTATUS););//聲明函數(shù)指針模型
運(yùn)行時(shí)會(huì)報(bào)錯(cuò)誤:
image?
由此,在聲明函數(shù)原型指針時(shí)要注意寫對(duì)調(diào)用約定,如果不知道,那么換著調(diào)試看那個(gè)對(duì)。
4、說明一下調(diào)用約定(Calling Convention)相關(guān)的(其他地方拷貝來的)


調(diào)用約定用來處理決定函數(shù)參數(shù)傳送時(shí)入棧和出棧的順序(由調(diào)用者還是被調(diào)用者把參數(shù)彈出棧),以及編譯器用來識(shí)別函數(shù)名稱的名稱修飾約定等問題。在Microsoft VC++ 6.0中定義了下面幾種調(diào)用約定,我們將結(jié)合匯編語言來一一分析它們:


4.1、__cdecl


__cdecl是C/C++和MFC程序默認(rèn)使用的調(diào)用約定,也可以在函數(shù)聲明時(shí)加上__cdecl關(guān)鍵字來手工指定。采用__cdecl約定時(shí),函數(shù)參數(shù)按照從右到左的順序入棧,并且由調(diào)用函數(shù)者把參數(shù)彈出棧以清理堆棧。因此,實(shí)現(xiàn)可變參數(shù)的函數(shù)只能使用該調(diào)用約定。由于每一個(gè)使用__cdecl約定的函數(shù)都要包含清理堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會(huì)比較大。__cdecl可以寫成_cdecl。


下面將通過一個(gè)具體實(shí)例來分析__cdecl約定:


在VC++中新建一個(gè)Win32 Console工程,命名為cdecl。其代碼如下:


int __cdecl Add(int a, int b); //函數(shù)聲明


void main()


{


Add(1,2); //函數(shù)調(diào)用


}


int __cdecl Add(int a, int b) //函數(shù)實(shí)現(xiàn)


{


return (a + b);


}


函數(shù)調(diào)用處反匯編代碼如下:


;Add(1,2);


push 2 ;參數(shù)從右到左入棧,先壓入2


push 1 ;壓入1


call @ILT+0(Add) (00401005) ;調(diào)用函數(shù)實(shí)現(xiàn)


add esp,8 ;由函數(shù)調(diào)用清棧


4.2、__stdcall


__stdcall調(diào)用約定用于調(diào)用Win32 API函數(shù)。采用__stdcal約定時(shí),函數(shù)參數(shù)按照從右到左的順序入棧,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的棧,函數(shù)參數(shù)個(gè)數(shù)固定。由于函數(shù)體本身知道傳進(jìn)來的參數(shù)個(gè)數(shù),因此被調(diào)用的函數(shù)可以在返回前用一條ret n指令直接清理傳遞參數(shù)的堆棧。__stdcall可以寫成_stdcall。


還是那個(gè)例子,將__cdecl約定換成__stdcall:


int __stdcall Add(int a, int b)


{


return (a + b);


}


函數(shù)調(diào)用處反匯編代碼:


; Add(1,2);


push 2 ;參數(shù)從右到左入棧,先壓入2


push 1 ;壓入1


call @ILT+10(Add) (0040100f) ;調(diào)用函數(shù)實(shí)現(xiàn)


函數(shù)實(shí)現(xiàn)部分的反匯編代碼:


;int __stdcall Add(int a, int b)


push ebp


mov ebp,esp


sub esp,40h


push ebx


push esi


push edi


lea edi,[ebp-40h]


mov ecx,10h


mov eax,0CCCCCCCCh


rep stos dword ptr [edi]


;return (a + b);


mov eax,dword ptr [ebp+8]


add eax,dword ptr [ebp+0Ch]


pop edi


pop esi


pop ebx


mov esp,ebp


pop ebp


ret 8 ;清棧


4.3、__fastcall


__fastcall約定用于對(duì)性能要求非常高的場(chǎng)合。__fastcall約定將函數(shù)的從左邊開始的兩個(gè)大小不大于4個(gè)字節(jié)(DWORD)的參數(shù)分別放在ECX和EDX寄存器,其余的參數(shù)仍舊自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的堆棧。__fastcall可以寫成_fastcall。


依舊是相類似的例子,此時(shí)函數(shù)調(diào)用約定為__fastcall,函數(shù)參數(shù)個(gè)數(shù)增加2個(gè):


int __fastcall Add(int a, double b, int c, int d)


{


return (a + b + c + d);


}


函數(shù)調(diào)用部分的匯編代碼:


;Add(1, 2, 3, 4);


push 4 ;后兩個(gè)參數(shù)從右到左入棧,先壓入4


mov edx,3 ;將int類型的3放入edx


push 40000000h ;壓入double類型的2


push 0


mov ecx,1 ;將int類型的1放入ecx


call @ILT+0(Add) (00401005) ;調(diào)用函數(shù)實(shí)現(xiàn)


函數(shù)實(shí)現(xiàn)部分的反匯編代碼:


; int __fastcall Add(int a, double b, int c, int d)


push ebp


mov ebp,esp


sub esp,48h


push ebx


push esi


push edi


push ecx


lea edi,[ebp-48h]


mov ecx,12h


mov eax,0CCCCCCCCh


rep stos dword ptr [edi]


pop ecx


mov dword ptr [ebp-8],edx


mov dword ptr [ebp-4],ecx


;return (a + b + c + d);


fild dword ptr [ebp-4]


fadd qword ptr [ebp+8]


fiadd dword ptr [ebp-8]


fiadd dword ptr [ebp+10h]


call __ftol (004011b8)


pop edi


pop esi


pop ebx


mov esp,ebp


pop ebp


ret 0Ch ;清棧


關(guān)鍵字__cdecl、__stdcall和__fastcall可以直接加在要輸出的函數(shù)前,也可以在編譯環(huán)境的Setting...->C/C++->Code Generation項(xiàng)選擇。它們對(duì)應(yīng)的命令行參數(shù)分別為/Gd、/Gz和/Gr。缺省狀態(tài)為/Gd,即__cdecl。當(dāng)加在輸出函數(shù)前的關(guān)鍵字與編譯環(huán)境中的選擇不同時(shí),直接加在輸出函數(shù)前的關(guān)鍵字有效。
========

DLL中導(dǎo)出函數(shù)(函數(shù)名及其調(diào)用約定)

http://www.cnblogs.com/leijiangtao/p/4797585.html
最近簡單研究了一下dll的導(dǎo)出函數(shù),整理了一下


1.導(dǎo)出函數(shù)名的問題


dll導(dǎo)出函數(shù)最簡單的語法是


void__declspec(dllexport) fun();


由于它默認(rèn)的是c++的調(diào)用約定cdecl,因此導(dǎo)出的函數(shù)就變成了


?fun@@YAXXZ


如果直接取函數(shù)名fun,就會(huì)找不到函數(shù),有兩種方法可以解決這個(gè)問題:用C的編譯方式和def文件


① ? ? ?用C的編譯方式


在導(dǎo)出函數(shù)前聲明extern “C”,即:


extern “C” void__declspec(dllexport) fun();


加入extern “C”是告訴編譯器,用C的編譯方式生成文件,不需要加入?yún)?shù)作為修飾


② ? ? ?Def文件


在project中建立一個(gè)def文件,寫入


LIBRARY ? "testDLL"// testDLL是project的名字


EXPORTS ? ? ? ? ? ?//輸出


? fun ? ? ? ? ? ? ?//函數(shù)名(也可以帶序號(hào)的輸出函數(shù)名fun@1)


extern “C” void__declspec(dllexport) 和在def文件中導(dǎo)出函數(shù)的作用是一樣的,因此沒必要都寫在工程中。


Ps,如果導(dǎo)出的函數(shù)名帶一些修飾,如:?fun@@YAXXZ,用GetProcAddress()函數(shù)直接調(diào)用“?fun@@YAXXZ”也是可以找到函數(shù)的。


2. 修飾函數(shù)的關(guān)鍵字


stdcall cdecl fastcall thiscall naked call


這些調(diào)用約定決定了:


? ? ? ? ? 參數(shù)傳遞次序


? ? ? ? ? 調(diào)用堆棧由誰(調(diào)用函數(shù)或被調(diào)用函數(shù))清理


? ? ? ? ? 導(dǎo)出函數(shù)名


導(dǎo)出函數(shù)的調(diào)用約定和使用這個(gè)函數(shù)時(shí)聲明的調(diào)用約定必須一致,否則程序會(huì)崩潰。


在C和C++中默認(rèn)的調(diào)用約定是__cdecl,上面函數(shù)完整的修飾就是:


void__declspec(dllexport) __cdeclfun();


但是windows系統(tǒng)用的回調(diào)函數(shù)一般都是_stdcall。


下面是各個(gè)調(diào)用約定詳細(xì)的解釋:


_stdcall


是Pascal方式清理C方式壓棧,通常用于Win32 Api中,函數(shù)采用從右到左的壓棧方式, 自己在退出時(shí)清空堆棧。VC將函數(shù)編譯后會(huì)在函數(shù)名前面加上下劃線前綴,在函數(shù)名后加上"@"和參數(shù)的字節(jié)數(shù)。


int f(void *p) -->> _f@4(在外部匯編語言里可以用這個(gè)名字引用這個(gè)函數(shù))?


__cdecl


C調(diào)用約定(即用__cdecl關(guān)鍵字說明)(The C default calling convention)按從右至左的順序壓參數(shù)入棧,由調(diào)用者把參數(shù)彈出棧。對(duì)于傳送參數(shù)的內(nèi)存棧是由調(diào)用者來維護(hù)的(正因?yàn)槿绱?#xff0c;實(shí)現(xiàn)可變參數(shù)vararg的函數(shù)(如printf)只能使用該調(diào)用約定)。


另外,在函數(shù)名修飾約定方面也有所不同。 _cdecl是C和C++程序的缺省調(diào)用方式。每一個(gè)調(diào)用它的函數(shù)都包含清空堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會(huì)比調(diào)用_stdcall函數(shù)的大。函數(shù)采用從右到左的壓棧方式。VC將函數(shù)編譯后會(huì)在函數(shù)名前面加上下劃線前綴。


_fastcall


調(diào)用的主要特點(diǎn)就是快,因?yàn)樗峭ㄟ^寄存器來傳送參數(shù)的(實(shí)際上,它用ECX和EDX傳送前兩個(gè)雙字(DWORD)或更小的參數(shù),剩下的參數(shù)仍舊自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的內(nèi)存棧),


在函數(shù)名修飾約定方面,它和前兩者均不同。__fastcall方式的函數(shù)采用寄存器傳遞參數(shù),VC將函數(shù)編譯后會(huì)在函數(shù)名前面加上"@"前綴,在函數(shù)名后加上"@"和參數(shù)的字節(jié)數(shù)。


thiscall


僅僅應(yīng)用于“C++”成員函數(shù)。this指針存放于CX/ECX寄存器中,參數(shù)從右到左壓。thiscall不是關(guān)鍵詞,因此不能被程序員指定。


naked call


當(dāng)采用1-4的調(diào)用約定時(shí),如果必要的話,進(jìn)入函數(shù)時(shí)編譯器會(huì)產(chǎn)生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數(shù)時(shí)則產(chǎn)生代碼恢復(fù)這些寄存器的內(nèi)容。


(這些代碼稱作 prolog and epilog code,一般,ebp,esp的保存是必須的).?


但是naked call不產(chǎn)生這樣的代碼。naked call不是類型修飾符,故必須和_declspec共同使用。?


另外,關(guān)鍵字 __stdcall、__cdecl和__fastcall可以直接加在要輸出的函數(shù)前。它們對(duì)應(yīng)的命令行參數(shù)分別為/Gz、/Gd和/Gr。缺省狀態(tài)為/Gd,即__cdecl。
========

總結(jié)

以上是生活随笔為你收集整理的win32 DLL 学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

丁香婷婷激情啪啪 | 国产69精品久久久久99尤 | 亚洲日本色 | 9999免费视频 | 麻豆精品视频在线观看免费 | 亚洲 欧美 综合 在线 精品 | 激情婷婷综合网 | 日韩成人免费在线 | www.色午夜 | 在线观看黄网站 | 国产手机免费视频 | 五月天色婷婷丁香 | 日韩久久精品一区二区三区 | 久久久精品国产一区二区三区 | 91精品视频免费看 | 成x99人av在线www | 国产亲近乱来精品 | 成人久久久久久久久久 | 午夜视频导航 | 天天人人综合 | 亚洲人片在线观看 | 91在线观看视频网站 | 亚洲更新最快 | 国产很黄很色的视频 | 亚洲国产免费看 | 久草久草视频 | 免费看的黄色小视频 | 午夜久久影视 | 久久y | 一二三四精品 | 天天操天天干天天爱 | 日韩免费av在线 | 五月婷婷丁香在线观看 | 51久久成人国产精品麻豆 | 91av在线视频播放 | 中文字幕在线观看视频一区二区三区 | 亚洲免费精品一区二区 | 国产97免费 | 日韩二区三区在线观看 | 日本婷婷色 | 欧美日韩在线精品一区二区 | 在线观看免费视频你懂的 | 亚洲精品字幕在线观看 | 成年性视频 | 色激情五月 | 色综合天天视频在线观看 | 九九在线视频免费观看 | 国产四虎在线 | 麻豆影视在线免费观看 | 天天操福利视频 | 伊人狠狠干 | 九9热这里真品2 | 国产精品理论片 | 最近中文字幕大全中文字幕免费 | 91.精品高清在线观看 | 国产免费人人看 | 婷婷成人亚洲综合国产xv88 | 丰满少妇久久久 | 免费三级黄色片 | 永久免费看av | 国产亚洲精品精品精品 | 2024国产精品视频 | 免费观看完整版无人区 | 免费情趣视频 | 久久草在线免费 | 首页av在线| 免费观看成人网 | 国产成人精品一区二三区 | 亚洲国产午夜视频 | 国产一级片直播 | 免费三级黄 | 91天天视频 | 国产黄色免费电影 | 成人av影视观看 | 欧美亚洲国产精品久久高清浪潮 | 欧美日本国产在线观看 | 在线91精品| 中文字幕日韩一区二区三区不卡 | 久久免费在线观看视频 | 久久情爱 | 国产96在线视频 | 日韩在线观看你懂的 | 碰超在线观看 | 97视频网址 | 97视频在线免费观看 | a天堂中文在线 | 国产精品一区二区无线 | 久久久免费电影 | 四虎国产永久在线精品 | 蜜臀久久99静品久久久久久 | 色a资源在线 | 九色精品免费永久在线 | 国产精品美女www爽爽爽视频 | 亚洲爱视频| 97视频在线观看视频免费视频 | www.日韩免费 | 久久视奸 | 国产精品一区二区三区在线免费观看 | 丁香六月五月婷婷 | 亚洲午夜精品久久久 | 人人爽人人爽人人 | 在线免费观看黄色大片 | 国产精品不卡在线 | 久久草精品 | 欧美一级片在线观看视频 | 免费日韩在线 | 日韩欧美在线观看一区二区 | 久久久片| 一区二区三区四区五区六区 | 九九涩涩av台湾日本热热 | 最近中文字幕在线中文高清版 | 日韩精品久久久免费观看夜色 | 97综合视频 | 免费视频a| 国语对白少妇爽91 | 亚洲国产一区av | 免费观看91视频大全 | 欧美日韩不卡在线视频 | 国产精品综合久久久久久 | 中文字幕 婷婷 | 久爱综合 | 国产成人在线网站 | 国产高清视频在线观看 | 国产视频黄 | 波多野结依在线观看 | 黄色在线视频网址 | 国产一区视频导航 | 狠狠gao | 四虎影视成人永久免费观看亚洲欧美 | 一本一本久久a久久 | 精品久久久久久一区二区里番 | 精品久久九九 | 激情偷乱人伦小说视频在线观看 | 五月天久久久 | 27xxoo无遮挡动态视频 | 亚洲九九九 | 国产精品免费在线观看视频 | 色com| 狠狠干夜夜 | 国产精品 日韩精品 | 国产精品免费看 | 亚洲精品乱码久久久久 | 国产 亚洲 欧美 在线 | 日韩网站一区二区 | 国产精品视频免费在线观看 | 久久久久久久久久久高潮一区二区 | 国产一级片网站 | 亚洲欧美视频在线观看 | 欧美日韩在线电影 | 免费一级特黄毛大片 | 婷婷国产视频 | 久久免费成人精品视频 | 免费中文字幕 | 国产三级久久久 | 亚洲午夜精品一区二区三区电影院 | 日韩一区二区三区观看 | 国产一级视屏 | 欧美小视频在线观看 | 国产精品久久久久久久7电影 | 久久久噜噜噜久久久 | 在线观看91精品视频 | 中文字幕之中文字幕 | 久久精品看片 | 91麻豆精品国产91久久久久 | 91精品国产91久久久久久三级 | 久久99精品国产一区二区三区 | 中文字幕在线视频一区二区三区 | 亚洲精品网站 | 色九色 | 骄小bbw搡bbbb揉bbbb | 国产网站色 | 欧美在线你懂的 | 日操干| 日韩美女高潮 | www.天天色.com | 日躁夜躁狠狠躁2001 | 黄色高清视频在线观看 | 亚洲 欧美日韩 国产 中文 | 日韩精品黄 | 丁香网五月天 | 亚洲精品视频免费在线观看 | 天天做综合网 | 欧美日韩三级在线观看 | 波多野结衣视频在线 | 五月天免费网站 | 久久久电影 | 在线观看免费视频你懂的 | 国产精品久久久久久久久久不蜜月 | 91完整版在线观看 | 日韩av免费大片 | 中文字幕av影院 | 久久国产精品一国产精品 | 国产精品网址在线观看 | 免费情趣视频 | 久久免费看片 | 黄污在线看 | 免费91在线观看 | 亚洲国产精品视频在线观看 | 99这里只有精品99 | 能在线观看的日韩av | 天海翼一区二区三区免费 | 国产看片 色 | 色综合天天视频在线观看 | 欧美嫩草影院 | 中文字幕第一页在线视频 | 91c网站色版视频 | 美女一级毛片视频 | 国产精品免费在线播放 | www.精选视频.com | 久久毛片视频 | 99热这里只有精品在线观看 | 又色又爽的网站 | 99精品视频网站 | 久久视屏网 | 亚洲精品一区二区18漫画 | 日韩精品亚洲专区在线观看 | 国产尤物在线 | 色婷五月天 | 91亚洲精品在线观看 | 国产美女网站视频 | 日韩一二区在线观看 | 男女全黄一级一级高潮免费看 | 色综合www | 福利一区二区 | 久久久精品 | 亚洲,国产成人av | 精品女同一区二区三区在线观看 | 国产精品美女免费看 | 亚洲精品免费看 | 日韩专区中文字幕 | 99视频偷窥在线精品国自产拍 | 操处女逼 | 日本中文字幕观看 | 欧美日韩在线视频免费 | 欧美日韩在线观看视频 | 9992tv成人免费看片 | 国产69久久 | 国产日韩精品视频 | 天天干天天射天天操 | 亚洲一区av | 欧美视频www | 久久激情五月丁香伊人 | 日韩视频一二三区 | 日韩精品中文字幕一区二区 | 探花视频在线观看免费 | 亚洲成av人影院 | 日日天天 | 伊人天天干| 超碰人人超| 国产乱对白刺激视频在线观看女王 | 亚洲精品一区二区在线观看 | 亚洲毛片久久 | 午夜av激情 | 日本精品久久久久中文字幕5 | 国产美女精品久久久 | 日本特黄一级片 | 欧美性生爱 | 在线观看精品一区 | 久久精品国产精品亚洲精品 | 亚洲三级av| 91精品国产99久久久久久红楼 | 18女毛片| 91精品国产高清自在线观看 | 亚洲成人资源在线 | 五月激情亚洲 | 国产精品毛片久久蜜 | 亚洲欧美视频在线播放 | 少妇超碰在线 | 中文字幕日韩无 | 欧美一区日韩精品 | 国产高清一区二区 | 亚洲电影影音先锋 | 亚洲精品视频在线观看免费 | 992tv在线观看 | 网站在线观看日韩 | 热久久视久久精品18亚洲精品 | 四虎成人精品永久免费av | 亚洲国内精品在线 | 精品无人国产偷自产在线 | av片中文| 伊人永久 | 一二三区视频在线 | 亚洲精品在线资源 | 久久婷婷精品 | 男女啪啪视屏 | 99视频在线免费 | 国产一区二区在线播放 | 日韩三区在线 | 又黄又色又爽 | av综合在线观看 | 欧美成人h版 | 在线免费观看黄 | 国产日韩av在线 | 久热久草在线 | 欧美精品九九99久久 | 特级片免费看 | 激情久久伊人 | 天天色天天干天天 | 能在线看的av | 草莓视频在线观看免费观看 | 一区二区三区精品在线视频 | 免费av福利| 欧美激情精品久久久久 | 激情图片区 | 免费高清国产 | 免费在线黄 | 欧美亚洲专区 | 黄色片视频在线观看 | 亚洲aⅴ在线观看 | 懂色av懂色av粉嫩av分享吧 | 日韩高清在线不卡 | 在线观看涩涩 | 欧美国产高清 | 免费日韩 精品中文字幕视频在线 | 91成年人在线观看 | 日韩欧美国产精品 | 国产在线黄 | 欧美午夜精品久久久久久孕妇 | av在线免费网 | 亚洲专区在线视频 | 91自拍91| 黄色av成人在线观看 | 日韩午夜在线播放 | 视频在线在亚洲 | 狠狠狠狠狠狠狠干 | 免费a视频在线 | 免费视频色 | 欧美韩国日本在线观看 | 国产成人三级在线观看 | 色婷婷 亚洲| 亚洲视频免费在线观看 | 日韩在线高清视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 午夜少妇一区二区三区 | 国产午夜精品一区二区三区嫩草 | 九七视频在线 | 五月婷综合 | 91麻豆国产福利在线观看 | 爱干视频 | 久草com| 又黄又爽免费视频 | 91视频高清 | 6080yy午夜一二三区久久 | 亚洲一区二区视频在线播放 | 九九在线视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 日本高清中文字幕有码在线 | 天天天综合 | 天天射天天操天天色 | 激情深爱.com| 久久久精品网站 | 色综合久久久久综合体桃花网 | 亚洲在线成人精品 | 久久国产精品99久久久久久进口 | 在线看的毛片 | 午夜精品视频福利 | 欧美精品在线免费 | 国产免费黄色 | 国产小视频在线播放 | 国产色婷婷精品综合在线手机播放 | 最新不卡av| 狠狠躁夜夜躁人人爽超碰91 | 午夜黄色影院 | 国内精品美女在线观看 | 天天做天天爱天天爽综合网 | 日韩欧美在线免费 | 久久久久草 | 日韩中文在线视频 | 91成人蝌蚪 | 黄色tv视频| 最新中文字幕视频 | 成人免费看黄 | 黄色看片 | 日韩在线视频免费看 | 国产精品99久久久久久大便 | 久久久久久免费毛片精品 | 色99久久| 一区二区视频欧美 | 四虎影视成人精品 | 免费欧美| av千婊在线免费观看 | 99re中文字幕 | 中文字幕一区二区三 | 国产一级大片免费看 | 国产青春久久久国产毛片 | 日韩欧美综合精品 | 色综合久久久久综合 | 麻豆精品视频 | 免费毛片一区二区三区久久久 | 午夜美女福利直播 | 日韩av电影一区 | 国产资源中文字幕 | 福利片免费看 | 色橹橹欧美在线观看视频高清 | zzijzzij日本成熟少妇 | 91.麻豆视频 | 五月婷婷视频在线 | 成人免费共享视频 | 国产精品一区二区在线看 | 亚洲免费公开视频 | 久久久久久久久久久久99 | 欧美a级在线播放 | 一区二区三区免费在线观看视频 | 在线观看岛国av | 午夜精品一区二区三区在线 | 亚洲成av人片一区二区梦乃 | 国内成人精品视频 | 肉色欧美久久久久久久免费看 | 最新色视频 | 国产精品11 | 欧美精品xx | 国产在线观看,日本 | 99久久超碰中文字幕伊人 | 日韩欧美视频在线免费观看 | 午夜久久久久 | 天天色天天爱天天射综合 | 国产精品理论片在线播放 | 国产精品一区二区在线免费观看 | www色,com| 久久九九久久九九 | 免费观看91视频大全 | 麻豆94tv免费版 | av在线中文| 国产又粗又硬又长又爽的视频 | 9久久精品| 五月婷在线 | 国产黄在线免费观看 | 亚洲永久精品视频 | 日韩电影在线观看一区二区三区 | 在线中文字幕播放 | 中文字幕.av.在线 | 亚洲综合色视频在线观看 | 国产无遮挡又黄又爽在线观看 | 亚洲最大成人免费网站 | 日韩在线视频网址 | 国产精品久久久久一区 | 一区二区三区免费在线观看视频 | 97成人啪啪网 | 2021国产精品视频 | 久久网址 | 99热精品免费观看 | 亚洲一区二区三区在线看 | 麻豆国产精品一区二区三区 | 国内精品久久久久久中文字幕 | 国产精品一区二区久久精品 | 97香蕉超级碰碰久久免费软件 | 国产高清永久免费 | 在线影院 国内精品 | 在线亚洲小视频 | 正在播放五月婷婷狠狠干 | 天天操天天舔天天干 | 久久字幕精品一区 | 精品国产亚洲日本 | 开心激情网五月天 | 日韩有码第一页 | 天天操天天摸天天爽 | 网站你懂的 | 成年人国产精品 | 黄色小说视频在线 | 区一区二区三区中文字幕 | 成年人免费在线播放 | 免费a视频在线观看 | 91自拍视频在线 | 97成人精品视频在线播放 | 三级av中文字幕 | 日韩四虎 | 久久久久一区二区三区四区 | 亚洲国产成人精品在线 | 天天鲁一鲁摸一摸爽一爽 | 精品国产免费看 | 精品国产精品一区二区夜夜嗨 | 国产小视频免费观看 | 91日韩在线播放 | a国产精品| 国产精品 久久 | va视频在线观看 | 国产91九色视频 | 国产美女网站视频 | 精品国产乱码久久久久久三级人 | 亚洲欧美成人 | 欧美91精品久久久久国产性生爱 | 精品久久久久久久 | 久久久久久国产精品免费 | 精品欧美一区二区在线观看 | bbbbb女女女女女bbbbb国产 | 免费www视频 | 久久爱影视i| 欧美日韩在线视频一区 | 在线天堂8√ | 中文字幕久久久精品 | 久久精品人 | 91成版人在线观看入口 | 狠狠色噜噜狠狠狠狠2022 | 国产精品久久久久一区二区国产 | 高清不卡毛片 | 91精品国产一区二区三区 | 国产精品国产三级国产不产一地 | 99 视频 高清 | 精品黄色片 | 国产精品免费视频久久久 | 在线免费精品视频 | 日韩av成人 | 精品女同一区二区三区在线观看 | 97偷拍在线视频 | 精品999久久久 | 99久久999久久久精玫瑰 | 五月天堂色 | 久久一区国产 | 欧美成人免费在线 | 日韩在线观看一区二区三区 | 激情黄色一级片 | 777奇米四色| 国产成人久久 | 久久久久久国产精品亚洲78 | 麻豆系列在线观看 | 日韩av线观看 | 日韩精品专区在线影院重磅 | 在线免费中文字幕 | 97人人模人人爽人人喊中文字 | 亚洲免费a | 黄色软件在线观看免费 | 黄色毛片在线 | 久久久久久久久亚洲精品 | 夜夜夜夜操 | 日韩精品视频免费看 | 精品一区二区免费 | 国产精品www | 色永久免费视频 | 亚洲人精品午夜 | 国产精品精品久久久 | 激情www | 天天操天天操 | 91天堂影院 | 91黄色视屏 | 人人爱人人做人人爽 | 日韩电影在线一区二区 | 亚州精品天堂中文字幕 | 欧美日韩在线网站 | 亚洲狠狠操 | 国产精品一区二区三区久久久 | 日本一区二区三区免费观看 | 精品国产一二区 | 中国一 片免费观看 | 免费观看www视频 | 国产一级二级在线播放 | 中文字幕在线观看免费 | 久久久久成人精品亚洲国产 | 91传媒激情理伦片 | 国产日本在线播放 | 97超级碰碰碰视频在线观看 | 激情五月看片 | 国模精品一区二区三区 | 91人人人 | 婷婷丁香色 | 婷婷在线综合 | 在线看日韩| 91av99| 久久高清免费视频 | 国产精品国产三级国产专区53 | 久久精品国产免费 | 欧美日韩在线观看一区二区三区 | 91在线免费看片 | 国产免费叼嘿网站免费 | 日韩精品在线视频 | 欧美日韩国产精品久久 | 97精品国产91久久久久久久 | 免费精品在线视频 | 在线观看国产麻豆 | 怡红院成人在线 | 久久久久久久久久久综合 | 免费黄色在线网址 | 日韩黄色免费电影 | 精品久久网 | 国产综合福利在线 | 久久久久久久久久久久久久av | 天天看天天干天天操 | 国产一二三区在线观看 | 成人午夜电影在线播放 | 夜夜操网站 | 狠狠久久 | 制服丝袜在线91 | 中文字幕免费高清av | 久久8精品| 99热九九这里只有精品10 | 成人午夜影视 | 欧美俄罗斯性视频 | 国产成人99久久亚洲综合精品 | 九九视频在线播放 | 日本精品中文字幕在线观看 | 最新日韩在线 | 亚洲精品在线视频网站 | 在线三级播放 | 午夜三级大片 | 日韩在线不卡 | 91黄站| 成人免费在线视频 | 超级碰视频 | 久久99久久99精品免视看婷婷 | 一区二区在线电影 | 久久久久久国产精品免费 | 亚洲综合少妇 | 五月婷婷免费 | 久久中文网| 97色综合 | 狠狠狠狠狠狠天天爱 | 国产午夜亚洲精品 | 日韩三级视频在线观看 | 一级一片免费观看 | 三级av黄色 | 日韩欧美一区二区三区黑寡妇 | 中文字幕在线播放日韩 | 波多野结衣电影一区 | 欧美三人交 | aaawww| 久久免费片 | 麻豆av一区二区三区在线观看 | 天天射天天爱天天干 | 最新日韩中文字幕 | 人人射人人 | 免费黄色av | 人人爽爽人人 | 色片网站在线观看 | 亚洲精品一区二区三区新线路 | 欧美另类tv | 国产又粗又猛又色又黄网站 | 人人爽人人澡 | 97精品免费视频 | 少妇bbw搡bbbb搡bbb | 精品a在线 | 精品毛片一区二区免费看 | 亚洲精品高清一区二区三区四区 | 欧美少妇18p | 国产精品com| 欧美日本一区 | 在线国产高清 | 玖玖色在线观看 | 狠狠操.com | 韩国三级在线一区 | 91福利视频免费 | 激情小说 五月 | 四虎4hu永久免费 | 成人中文字幕+乱码+中文字幕 | 中文字幕在线观看视频一区二区三区 | 看av免费网站 | 91精品视频在线看 | 国产一区二区三区高清播放 | 欧美少妇xxxxxx | 国产精品第一页在线观看 | 在线免费黄色av | 久久久久久国产精品999 | 国产精品美女 | 中文字幕在线成人 | 麻豆影视在线观看 | 国产精品第二页 | 男女啪啪视屏 | av色网站| 欧美日韩调教 | 免费看三级网站 | 欧美一级欧美一级 | 日韩在线视频线视频免费网站 | 国产午夜精品一区二区三区嫩草 | 欧美日本三级 | 在线观看完整版免费 | 日韩理论电影在线观看 | 亚洲黄色片在线 | 久久高清精品 | 国产成人在线播放 | 最新国产精品视频 | 日韩欧美一区二区在线播放 | 日韩二三区 | 日本黄网站 | 免费成人黄色av | 99亚洲精品 | 欧美日韩性视频在线 | 免费99精品国产自在在线 | 天天射天天舔天天干 | 久久精品视频免费播放 | 成人h视频| 日韩超碰在线 | 成人a免费视频 | 婷婷激情综合 | 久久精品欧美日韩精品 | www色 | 婷婷资源站 | 99精品一级欧美片免费播放 | 免费观看www7722午夜电影 | 欧美韩日在线 | 在线看片一区 | 亚洲视频免费在线观看 | 女人18片毛片90分钟 | 国产精品免费一区二区三区 | 欧美另类xxx| 久久久男人的天堂 | 国产视频在线观看一区二区 | 欧美日韩一区二区三区免费视频 | 五月天综合婷婷 | 色狠狠婷婷 | 色综合小说 | 在线观看黄网站 | 操操操夜夜操 | 欧美精品亚洲精品日韩精品 | 人人爽夜夜爽 | 在线香蕉视频 | 中文字幕4 | 在线 欧美 日韩 | 黄色国产在线 | 日本在线中文在线 | 婷婷久操| 亚洲一区 影院 | 免费看一级特黄a大片 | 在线视频第一页 | 国产一区二区三区黄 | 黄色亚洲精品 | 激情视频免费在线观看 | 一区二区中文字幕在线观看 | 黄色片毛片 | 欧洲精品码一区二区三区免费看 | 一区二区三区四区久久 | 国产h在线播放 | 免费网址你懂的 | 国产一级高清 | 午夜黄色大片 | 青青草久草在线 | 欧美一级电影 | 亚洲人成在线电影 | 久久免费视频精品 | 夜夜高潮夜夜爽国产伦精品 | 亚洲永久国产精品 | 久久久三级视频 | 热九九精品 | 欧美色图视频一区 | 国产一级视频在线观看 | 五月香视频在线观看 | 日韩激情小视频 | 麻豆91在线观看 | 久草精品视频在线看网站免费 | 最近高清中文字幕 | 久久国产精品久久国产精品 | 五月婷综合网 | 中文国产成人精品久久一 | 91免费观看视频网站 | 中文字幕在线观看第一页 | 久久色视频 | 色99导航| 国产精品免费一区二区 | 黄色成品视频 | 久久香蕉一区 | 日本久久久精品视频 | 国产传媒中文字幕 | 欧美激情综合五月色丁香 | 国产精品高清一区二区三区 | 国产高清视频网 | 中文字幕 国产 一区 | 欧美日韩精品在线 | 久久久精品网 | 免费观看9x视频网站在线观看 | 久久激五月天综合精品 | 伊甸园永久入口www 99热 精品在线 | 国产精品久久一区二区无卡 | 最近2019中文免费高清视频观看www99 | 中文在线天堂资源 | av黄在线播放 | 狠狠五月天 | 亚洲国产视频在线 | 国产视频高清 | 在线a亚洲视频播放在线观看 | 精品亚洲一区二区 | 成人国产在线 | 国内成人av | 一区二区三区在线免费观看视频 | 午夜精品视频福利 | 片黄色毛片黄色毛片 | 亚洲最新av在线网站 | 成人久久视频 | 91传媒在线观看 | 久久av中文字幕片 | 国产成人精品午夜在线播放 | 欧美日韩69| 国产中文字幕在线看 | 在线免费观看黄色小说 | 欧美精品v国产精品 | 国产日韩欧美在线影视 | 国产精品2019 | 亚洲国产字幕 | av电影在线免费 | 免费国产在线精品 | 国产精品第一页在线 | 久草 | 日日夜夜婷婷 | 国产精品一区二区在线观看免费 | 一区二区三区四区精品 | 久久视频精品 | 色999五月色 | 国产一区精品在线 | 国产一区电影在线观看 | 免费av在线网站 | 亚洲高清不卡av | 一区二区三区四区五区在线 | 99精品影视| 国产在线黄 | 午夜精品久久久久久久久久 | 欧亚日韩精品一区二区在线 | 蜜臀久久99精品久久久酒店新书 | 六月久久婷婷 | 91丨九色丨国产女 | 狠狠干夜夜 | 亚洲一级二级 | 天堂在线视频免费观看 | 久久精品视频在线免费观看 | 免费黄色av | 91精品天码美女少妇 | 日b视频在线观看网址 | 国产不卡精品 | 亚洲狠狠操 | 亚洲成人午夜av | 欧美日韩大片在线观看 | 久久人人艹 | 国产精品综合久久久久久 | 天天综合色网 | 亚洲精品乱码久久久一二三 | 日韩精品免费在线播放 | 久久久久久久久久久久国产精品 | 婷婷五综合| 91精品高清| 国产二级视频 | 婷婷在线综合 | 97在线公开视频 | 天天爽人人爽夜夜爽 | 久久精品久久久久电影 | 中文字幕免费在线看 | 国产韩国精品一区二区三区 | 欧美激情亚洲综合 | 91丨九色丨高潮 | 激情五月婷婷综合网 | a特级毛片| 国产黄色资源 | 欧美一区二区三区免费观看 | av成人在线观看 | 亚洲黄色免费电影 | 91在线视频免费91 | 亚洲国产黄色 | 四虎成人免费观看 | 日韩在线观看三区 | 在线播放日韩 | 亚洲高清av在线 | 国产一区二区久久精品 | 久久免费视频在线观看30 | 久久久久久久影视 | a电影免费看 | 日韩专区在线 | 精品999在线| 日韩性片 | 亚洲激情校园春色 | 99久久综合精品五月天 | 国产激情电影综合在线看 | 国产高潮久久 | 中文字幕五区 | 一本色道久久综合亚洲二区三区 | 韩国精品一区二区三区六区色诱 | 国产亚洲人成网站在线观看 | 中文字幕人成人 | 天天射天天干 | 中文字幕网站 | 久久国产精品电影 | 免费婷婷| 黄色成人免费电影 | 国产九九精品视频 | 麻豆va一区二区三区久久浪 | 伊人婷婷久久 | 日韩r级电影在线观看 | 国产精品99免视看9 国产精品毛片一区视频 | 精品亚洲二区 | 国产精品99久久久久 | 日韩国产欧美在线视频 | 久久精品中文字幕免费mv | 三级动态视频在线观看 | 欧美伦理电影一区二区 | 午夜精品久久久久久久99无限制 | 91在线视频播放 | 免费日韩一区二区 | 久久久久久免费网 | 黄色在线网站噜噜噜 | 亚洲精品视频在线观看免费 | 草免费视频| 久久久久久久久毛片精品 | 麻豆你懂的 | 五月天激情婷婷 | 深夜免费福利网站 | 欧美一级性视频 | 欧美精品一区二区在线观看 | 中文字幕在线视频免费播放 | 嫩小bbbb摸bbb摸bbb | 激情五月婷婷激情 | 国产精品观看在线亚洲人成网 | 成年人免费看的视频 | 国产麻豆剧传媒免费观看 | 最新中文在线视频 | 五月婷婷一级片 | 91社区国产高清 | 中文字幕乱码亚洲精品一区 | 久久人人爽av | 精品视频久久久 | 亚洲色图色 | 黄色91免费观看 | 玖草在线观看 | 久久97久久| 日本xxxx.com | 久久综合久久久久88 | 激情视频区 | 六月丁香在线观看 | 91视频在线观看免费 | 91视频电影 | 国产一二区视频 | 在线韩国电影免费观影完整版 | 日本三级久久 | 视频成人永久免费视频 | 久草精品资源 | 国产成人精品亚洲a | 999电影免费在线观看2020 | 91精品久久久久久久99蜜桃 | 欧美黑人性爽 | 麻豆一区二区 | 韩国av一区 | 69国产盗摄一区二区三区五区 | 日韩免费成人 | 美女网站在线观看 | 国产精品99久久99久久久二8 | 久久久蜜桃一区二区 | 91精品视频导航 | 激情欧美网| 综合国产视频 | 日韩综合第一页 | 久久一区精品 | 在线91视频 | 欧美a在线免费观看 | 国产精品免费看 | 色播五月激情综合网 | 欧美视频日韩视频 | 久久福利综合 | 久久免费一 | 黄色成品视频 | 久久不卡日韩美女 | 黄色一级在线免费观看 | 99自拍视频在线观看 | 精品久久美女 | 爱干视频| 亚洲精品国产日韩 | 日韩av免费网站 | 一二三区在线 | 婷婷网在线 | 久久精品99国产精品日本 | 黄色影院在线免费观看 | 亚洲禁18久人片 | 精品亚洲一区二区三区 | 日韩亚洲国产精品 | 天天拍天天操 | 日韩在线字幕 | 操操色| 粉嫩一区二区三区粉嫩91 | 欧美在线视频精品 | 欧美日韩在线精品 | 美女精品国产 | 国产一区欧美二区 | aⅴ视频在线 | 91九色视频观看 | 中文字幕免费 | 91网页版免费观看 | 日韩中文字幕国产精品 | 操久久免费视频 | 久久久久国产精品免费免费搜索 | 久久亚洲专区 | 欧美不卡视频在线 | 中文字幕亚洲欧美日韩2019 | 91香蕉视频黄色 | 国产精品视频在线观看 | 久久一线 | 国内精品国产三级国产aⅴ久 | 狠狠干成人综合网 | 免费精品视频 | 免费在线观看中文字幕 | 女人18精品一区二区三区 | 久草视频国产 | 黄色三级在线 | 亚洲综合欧美日韩狠狠色 | 麻豆久久 | 麻豆影视在线观看 | 人人干人人艹 | 人人插超碰 | 五月婷婷在线视频观看 | 天天操天天爽天天干 | 中文字幕av在线 | 激情网综合 | 黄色影院在线免费观看 | 波多野结衣亚洲一区二区 | 国产又粗又硬又爽视频 | 三级视频国产 | 18久久久 | 亚洲精品视 |