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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

What are TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR (etc.)?

發(fā)布時間:2024/4/11 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 What are TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR (etc.)? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc

?

Many C++ Windows programmers get confused over what bizarre identifiers like TCHAR, LPCTSTR are. In this article, I would attempt by best to clear out the fog.

In general, a character can be represented in 1 byte or 2 bytes. Let's say 1-byte character is ANSI character - all English characters are represented through this encoding. And let's say a 2-byte character is Unicode, which can represent ALL languages in the world.

The Visual C++ compiler supports char and wchar_t as native data-types for ANSI and Unicode characters, respectively. Though there is more concrete definition of Unicode, but for understanding assume it as two-byte character which Windows OS uses for multiple language support.

There is more to Unicode than 2-bytes character representation Windows uses. Microsoft Windows use UTF-16 character encoding.

What if you want your C/C++ code to be independent of character encoding/mode used?

Suggestion: Use generic data-types and names to represent characters and string.

For example, instead of replacing:

Collapse | Copy Code

char cResponse; // 'Y' or 'N' char sUsername[64]; // str* functions

with

Collapse | Copy Code

wchar_t cResponse; // 'Y' or 'N' wchar_t sUsername[64]; // wcs* functions

In order to support multi-lingual (i.e., Unicode) in your language, you can simply code it in more generic manner:

Collapse | Copy Code

#include<TCHAR.H> // Implicit or explicit include TCHAR cResponse; // 'Y' or 'N' TCHAR sUsername[64]; // _tcs* functions

The following project setting in General page describes which Character Set is to be used for compilation: (General -> Character Set)

This way, when your project is being compiled as Unicode, the TCHAR would translate to wchar_t. If it is being compiled as ANSI/MBCS, it would be translated to char. You are free to use char and wchar_t, and project settings will not affect any direct use of these keywords.

TCHAR is defined as:

Collapse | Copy Code

#ifdef _UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif

The macro _UNICODE is defined when you set Character Set to "Use Unicode Character Set", and therefore TCHARwould mean wchar_t. When Character Set if set to "Use Multi-Byte Character Set", TCHAR would mean char.

Likewise, to support multiple character-set using single code base, and possibly supporting multi-language, use specific functions (macros). Instead of using strcpy, strlen, strcat (including the secure versions suffixed with_s); or wcscpy, wcslen, wcscat (including secure), you should better use use _tcscpy, _tcslen, _tcscatfunctions.

As you know strlen is prototyped as:

Collapse | Copy Code

size_t strlen(const char*);

And, wcslen is prototyped as:

Collapse | Copy Code

size_t wcslen(const wchar_t* );

You may better use _tcslen, which is logically prototyped as:

Collapse | Copy Code

size_t _tcslen(const TCHAR* );

WC is for Wide Character. Therefore, wcs turns to be wide-character-string. This way, _tcs would mean _T Character String. And you know _T may be char or what_t, logically.

But, in reality, _tcslen (and other _tcs functions) are actually not functions, but macros. They are defined simply as:

Collapse | Copy Code

#ifdef _UNICODE #define _tcslen wcslen #else #define _tcslen strlen #endif

You should refer TCHAR.H to lookup more macro definitions like this.

You might ask why they are defined as macros, and not implemented as functions instead? The reason is simple: A library or DLL may export a single function, with same name and prototype (Ignore overloading concept of C++). For instance, when you export a function as:

Collapse | Copy Code

void _TPrintChar(char);

How the client is supposed to call it as?

Collapse | Copy Code

void _TPrintChar(wchar_t);

_TPrintChar cannot be magically converted into function taking 2-byte character. There has to be two separate functions:

Collapse | Copy Code

void PrintCharA(char); // A = ANSI void PrintCharW(wchar_t); // W = Wide character

And a simple macro, as defined below, would hide the difference:

Collapse | Copy Code

#ifdef _UNICODE void _TPrintChar(wchar_t); #else void _TPrintChar(char); #endif

The client would simply call it as:

Collapse | Copy Code

TCHAR cChar; _TPrintChar(cChar);

Note that both TCHAR and _TPrintChar would map to either Unicode or ANSI, and therefore cChar and the argument to function would be either char or wchar_t.

Macros do avoid these complications, and allows us to use either ANSI or Unicode function for characters and strings. Most of the Windows functions, that take string or a character are implemented this way, and for programmers convenience, only one function (a macro!) is good. SetWindowText is one example:

Collapse | Copy Code

// WinUser.H #ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif // !UNICODE

There are very few functions that do not have macros, and are available only with suffixed W or A. One example isReadDirectoryChangesW, which doesn't have ANSI equivalent.


You all know that we use double quotation marks to represent strings. The string represented in this manner is ANSI-string, having 1-byte each character. Example:

Collapse | Copy Code

"This is ANSI String. Each letter takes 1 byte."

The string text given above is not Unicode, and would be quantifiable for multi-language support. To represent Unicode string, you need to use prefix L. An example:

Collapse | Copy Code

L"This is Unicode string. Each letter would take 2 bytes, including spaces."

Note the L at the beginning of string, which makes it a Unicode string. All characters (I repeat all characters) would take two bytes, including all English letters, spaces, digits, and the null character. Therefore, length of Unicode string would always be in multiple of 2-bytes. A Unicode string of length 7 characters would need 14 bytes, and so on. Unicode string taking 15 bytes, for example, would not be valid in any context.

In general, string would be in multiple of sizeof(TCHAR) bytes!

When you need to express hard-coded string, you can use:

Collapse | Copy Code

"ANSI String"; // ANSI L"Unicode String"; // Unicode_T("Either string, depending on compilation"); // ANSI or Unicode // or use TEXT macro, if you need more readability

The non-prefixed string is ANSI string, the L prefixed string is Unicode, and string specified in _T or TEXT would be either, depending on compilation. Again, _T and TEXT are nothing but macros, and are defined as:

Collapse | Copy Code

// SIMPLIFIED #ifdef _UNICODE #define _T(c) L##c#define TEXT(c) L##c #else #define _T(c) c#define TEXT(c) c #endif

The ## symbol is token pasting operator, which would turn _T("Unicode") into L"Unicode", where the string passed is argument to macro - If _UNICODE is defined. If _UNICODE is not defined, _T("Unicode") would simply mean "Unicode". The token pasting operator did exist even in C language, and is not specific about VC++ or character encoding.
Note that these macros can be used for strings as well as characters. _T('R') would turn into L'R' or simple 'R' - former is Unicode character, latter is ANSI character.

No, you cannot use these macros to convert variables (string or character) into Unicode/non-Unicode text. Following is not valid:

Collapse | Copy Code

char c = 'C'; char str[16] = "CodeProject";_T(c); _T(str);

The bold lines would get successfully compiled in ANSI (Multi-Byte) build, since _T(x) would simply be x, and therefore _T(c) and _T(str) would come out to be c and str, respectively. But, when you build it with Unicode character set, it would fail to compile:

Collapse | Copy Code

error C2065: 'Lc' : undeclared identifier error C2065: 'Lstr' : undeclared identifier

I would not like to insult your intelligence by describing why and what those errors are.

There exist set of conversion routine to convert MBCS to Unicode and vice versa, which I would explain soon.

It is important to note that almost all functions that take string (or character), primarily in Windows API, would have generalized prototype in MSDN and elsewhere. The function SetWindowTextA/W, for instance, be classified as:

Collapse | Copy Code

BOOL SetWindowText(HWND, const TCHAR*);

But, as you know, SetWindowText is just a macro, and depending on your build settings, it would mean either of following:

Collapse | Copy Code

BOOL SetWindowTextA(HWND, const char*); BOOL SetWindowTextW(HWND, const wchar_t*);

Therefore, don't be puzzled if following call fails to get address of this function!

Collapse | Copy Code

HMODULE hDLLHandle; FARPROC pFuncPtr;hDLLHandle = LoadLibrary(L"user32.dll");pFuncPtr = GetProcAddress(hDLLHandle, "SetWindowText"); //pFuncPtr will be null, since there doesn't exist any function with name SetWindowText !

From User32.DLL, the two functions SetWindowTextA and SetWindowTextW are exported, not the function with generalized name.

Interestingly, .NET Framework is smart enough to locate function from DLL with generalized name:

Collapse | Copy Code

[DllImport("user32.dll")] extern public static int SetWindowText(IntPtr hWnd, string lpString);

No rocket science, just bunch of ifs and else around GetProcAddress!

All of the functions that have ANSI and Unicode versions, would have actual implementation only in Unicode version. That means, when you call SetWindowTextA from your code, passing an ANSI string - it would convert the ANSI string to Unicode text and then would call SetWindowTextW. The actual work (setting the window text/title/caption) will be performed by Unicode version only!

Take another example, which would retrieve the window text, using GetWindowText. You call GetWindowTextA, passing ANSI buffer as target buffer. GetWindowTextA would first call GetWindowTextW, probably allocating a Unicode string (a wchar_t array) for it. Then it would convert that Unicode stuff, for you, into ANSI string.

This ANSI to Unicode and vice-versa conversion is not limited to GUI functions, but entire set of Windows API, which do take strings and have two variants. Few examples could be:

  • CreateProcess
  • GetUserName
  • OpenDesktop
  • DeleteFile
  • etc

It is therefore very much recommended to call the Unicode version directly. In turn, it means you should alwaystarget for Unicode builds, and not ANSI builds - just because you are accustomed to using ANSI string for years. Yes, you may save and retrieve ANSI strings, for example in file, or send as chat message in your messenger application. The conversion routines do exist for such needs.

Note: There exists another typedef: WCHAR, which is equivalent to wchar_t.


The TCHAR macro is for a single character. You can definitely declare an array of TCHAR. What if you would like to express a character-pointer, or a const-character-pointer - Which one of the following?

Collapse | Copy Code

// ANSI characters foo_ansi(char*); foo_ansi(const char*); /*const*/ char* pString; // Unicode/wide-string foo_uni(WCHAR*); wchar_t* foo_uni(const WCHAR*); /*const*/ WCHAR* pString; // Independent foo_char(TCHAR*); foo_char(const TCHAR*); /*const*/ TCHAR* pString;

After reading about TCHAR stuff, you would definitely select the last one as your choice. There are better alternatives available to represent strings. For that, you just need to include Windows.h. Note: If your project implicitly or explicitly includes Windows.h, you need not include TCHAR.H

First, revisit old string functions for better understanding. You know strlen:

Collapse | Copy Code

size_t strlen(const char*);

Which may be represented as:

Collapse | Copy Code

size_t strlen(LPCSTR);

Where symbol LPCSTR is typedef'ed as:

Collapse | Copy Code

// Simplified typedef const char* LPCSTR;

The meaning goes like:

  • LP - Long Pointer
  • C - Constant
  • STR - String

Essentially, LPCSTR would mean (Long) Pointer to a Constant String.

Let's represent strcpy using new style type-names:

Collapse | Copy Code

LPSTR strcpy(LPSTR szTarget, LPCSTR szSource);

The type of szTarget is LPSTR, without C in the type-name. It is defined as:

Collapse | Copy Code

typedef char* LPSTR;

Note that the szSource is LPCSTR, since strcpy function will not modify the source buffer, hence the constattribute. The return type is non-constant-string: LPSTR.

Alright, these str-functions are for ANSI string manipulation. But we want routines for 2-byte Unicode strings. For the same, the equivalent wide-character str-functions are provided. For example, to calculate length of wide-character (Unicode string), you would use wcslen:

Collapse | Copy Code

size_t nLength; nLength = wcslen(L"Unicode");

The prototype of wcslen is:

Collapse | Copy Code

size_t wcslen(const wchar_t* szString); // Or WCHAR*

And that can be represented as:

Collapse | Copy Code

size_t wcslen(LPCWSTR szString);

Where the symbol LPCWSTR is defined as:

Collapse | Copy Code

typedef const WCHAR* LPCWSTR; // const wchar_t*

Which can be broken down as:

  • LP - Pointer
  • C - Constant
  • WSTR - Wide character String

Similarly, strcpy equivalent is wcscpy, for Unicode strings:

Collapse | Copy Code

wchar_t* wcscpy(wchar_t* szTarget, const wchar_t* szSource)

Which can be represented as:

Collapse | Copy Code

LPWSTR wcscpy(LPWSTR szTarget, LPWCSTR szSource);

Where the target is non-constant wide-string (LPWSTR), and source is constant-wide-string.

There exist set of equivalent wcs-functions for str-functions. The str-functions would be used for plain ANSI strings, and wcs-functions would be used for Unicode strings.

Though, I already advised to use Unicode native functions, instead of ANSI-only or TCHAR-synthesized functions. The reason was simple - your application must only be Unicode, and you should not even care about code portability for ANSI builds. But for the sake of completeness, I am mentioning these generic mappings.

To calculate length of string, you may use _tcslen function (a macro). In general, it is prototyped as:

Collapse | Copy Code

size_t _tcslen(const TCHAR* szString);

Or, as:

Collapse | Copy Code

size_t _tcslen(LPCTSTR szString);

Where the type-name LPCTSTR can be classified as:

  • LP - Pointer
  • C - Constant
  • T = TCHAR
  • STR = String

Depending on the project settings, LPCTSTR would be mapped to either LPCSTR (ANSI) or LPCWSTR (Unicode).

Note: strlen, wcslen or _tcslen will return number of characters in string, not the number of bytes.

The generalized string-copy routine _tcscpy is defined as:

Collapse | Copy Code

size_t _tcscpy(TCHAR* pTarget, const TCHAR* pSource);

Or, in more generalized form, as:

Collapse | Copy Code

size_t _tcscpy(LPTSTR pTarget, LPCTSTR pSource);

You can deduce the meaning of LPTSTR!

Usage Examples

First, a broken code:

Collapse | Copy Code

int main() {TCHAR name[] = "Saturn";int nLen; // Or size_tlLen = strlen(name); }

On ANSI build, this code will successfully compile since TCHAR would be char, and hence name would be an array ofchar. Calling strlen against name variable would also work flawlessly.

Alright. Let's compile the same with with UNICODE/_UNICODE defined (i.e. "Use Unicode Character Set" in project settings). Now, the compiler would report set of errors:

  • error C2440: 'initializing' : cannot convert from 'const char [7]' to 'TCHAR []'
  • error C2664: 'strlen' : cannot convert parameter 1 from 'TCHAR []' to 'const char *'

And the programmers would start committing mistakes by correcting it this way (first error):

Collapse | Copy Code

TCHAR name[] = (TCHAR*)"Saturn";

Which will not pacify the compiler, since the conversion is not possible from TCHAR* to TCHAR[7]. The same error would also come when native ANSI string is passed to a Unicode function:

Collapse | Copy Code

nLen = wcslen("Saturn"); // ERROR: cannot convert parameter 1 from 'const char [7]' to 'const wchar_t *'

Unfortunately (or fortunately), this error can be incorrectly corrected by simple C-style typecast:

Collapse | Copy Code

nLen = wcslen((const wchar_t*)"Saturn");

And you'd think you've attained one more experience level in pointers! You are wrong - the code would give incorrect result, and in most cases would simply cause Access Violation. Typecasting this way is like passing a float variable where a structure of 80 bytes is expected (logically).

The string "Saturn" is sequence of 7 bytes:

'S' (83)
'a' (97)
't' (116)
'u' (117)
'r' (114)
'n' (110)
'\0' (0)

But when you pass same set of bytes to wcslen, it treats each 2-byte as a single character. Therefore first two bytes [97, 83] would be treated as one character having value: 24915 (97<<8 | 83). It is Unicode character: ?. And the next character is represented by [117, 116] and so on.

For sure, you didn't pass those set of Chinese characters, but improper typecasting has done it! Therefore it is very essential to know that type-casting will not work! So, for the first line of initialization, you must do:

Collapse | Copy Code

TCHAR name[] = _T("Saturn");

Which would translate to 7-bytes or 14-bytes, depending on compilation. The call to wcslen should be:

Collapse | Copy Code

wcslen(L"Saturn");

In the sample program code given above, I used strlen, which causes error when building in Unicode. The non-working solution is C-sytle typecast:

Collapse | Copy Code

lLen = strlen ((const char*)name);

On Unicode build, name would be of 14-bytes (7 Unicode characters, including null). Since string "Saturn" contains only English letters, which can be represented using original ASCII, the Unicode letter 'S' would be represented as [83, 0]. Other ASCII characters would be represented with a zero next to them. Note that 'S' is now represented as2-byte value 83. The end of string would be represented by two bytes having value 0.

So, when you pass such string to strlen, the first character (i.e. first byte) would be correct ('S' in case of "Saturn"). But the second character/byte would indicate end of string. Therefore, strlen would return incorrect value 1 as the length of string.

As you know, Unicode string may contain non-English characters, the result of strlen would be more undefined.

In short, typecasting will not work. You either need to represent strings in correct form itself, or use ANSI to Unicode, and vice-versa, routines for conversions.

(There is more to add from this location, stay tuned!)


Now, I hope you understand the following signatures:

Collapse | Copy Code

BOOL SetCurrentDirectory( LPCTSTR lpPathName ); DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer);

Continuing. You must have seen some functions/methods asking you to pass number of characters, or returning the number of characters. Well, like GetCurrentDirectory, you need to pass number of characters, and not number of bytes. For example:

Collapse | Copy Code

TCHAR sCurrentDir[255];// Pass 255 and not 255*2 GetCurrentDirectory(sCurrentDir, 255);

On the other side, if you need to allocate number or characters, you must allocate proper number of bytes. In C++, you can simply use new:

Collapse | Copy Code

LPTSTR pBuffer; // TCHAR* pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.

But if you use memory allocation functions like malloc, LocalAlloc, GlobalAlloc, etc; you must specify the number of bytes!

Collapse | Copy Code

pBuffer = (TCHAR*) malloc (128 * sizeof(TCHAR) );

Typecasting the return value is required, as you know. The expression in malloc's argument ensures that it allocates desired number of bytes - and makes up room for desired number of characters.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

轉(zhuǎn)載于:https://my.oschina.net/ruiwong/blog/73957

總結(jié)

以上是生活随笔為你收集整理的What are TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR (etc.)?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

天天射天天做 | 欧美性生活久久 | 中文字幕在线观看免费 | 久久99精品久久久久久三级 | 亚洲午夜久久久久久久久 | 成人亚洲免费 | 国产成人综合图片 | 精品欧美一区二区三区久久久 | 亚洲乱码精品久久久 | av网站大全免费 | 五月婷婷久草 | 黄色成人在线观看 | 亚洲国产资源 | 欧美日韩高清不卡 | 成人在线播放av | 国产毛片久久 | 亚洲三级视频 | 91精品在线观看视频 | 亚洲一区在线看 | 五月宗合网 | 毛片的网址 | 狠狠久久婷婷 | 综合网天天色 | 亚洲精品国产精品国自产在线 | 麻豆视频免费入口 | 精品亚洲在线 | 日韩激情久久 | 久久a v电影 | 国产精品入口a级 | 在线 国产 亚洲 欧美 | 97成人精品视频在线观看 | 六月丁香激情网 | 亚洲精品乱码久久久久久蜜桃欧美 | 日韩有码中文字幕在线 | 最新中文字幕在线资源 | av片无限看 | 国产无遮挡又黄又爽馒头漫画 | 免费观看一区二区 | 国产精品手机在线观看 | 中文av在线免费观看 | 毛片网站在线观看 | 韩国av在线播放 | 久草视频在线看 | 久草在线视频在线观看 | 国产精品美女 | 亚洲 欧洲av | 国产精品色 | av高清免费 | 久热色超碰 | 亚洲日本一区二区在线 | 国产一级片观看 | 色综合天天综合网国产成人网 | 最近中文字幕国语免费av | 久视频在线| 国产黄 | 国产精选视频 | 国产精品不卡视频 | 免费看一级一片 | www免费视频com━ | 国产成人综合精品 | 日日夜夜天天久久 | 国产精品综合久久久久 | 久久精品中文字幕免费mv | 日韩精品视 | 欧美在线视频日韩 | 日韩电影在线看 | 午夜91在线 | 日韩在线观看你懂的 | av天天草| 久久久久久久久久久福利 | 亚洲 欧洲 国产 日本 综合 | 国产成人一区二区三区影院在线 | 日韩av快播电影网 | 亚洲精品国产拍在线 | 亚洲成人黄色网址 | 成人国产网址 | 最近字幕在线观看第一季 | 在线观看深夜视频 | 成人免费观看网站 | 色九九在线 | www日日夜夜| 日本久久久久 | 日韩性xxxx | 丁香婷婷久久久综合精品国产 | 一级国产视频 | 久热免费在线 | 超碰com| 麻豆综合网| 成人国产精品久久久 | 国产日产精品一区二区三区四区 | 91热在线| 久久久午夜精品理论片中文字幕 | 狠狠色伊人亚洲综合网站色 | 日本不卡123区 | 国产裸体视频网站 | 天天操狠狠操 | 天天操综 | 麻豆免费在线视频 | 日韩中文字幕亚洲一区二区va在线 | 国产精品嫩草在线 | 欧美精品乱码99久久影院 | 国产精品女同一区二区三区久久夜 | 成人欧美一区二区三区黑人麻豆 | 欧美日韩激情视频8区 | 国产黄a三级三级 | 久热精品国产 | 97操操操 | 综合色天天 | 91av原创 | 久久露脸国产精品 | 国产精品永久久久久久久久久 | 九七视频在线 | 国产成人久久精品一区二区三区 | 91精品免费在线视频 | 麻豆影视在线免费观看 | 久久久久久久国产精品 | 99精品在线视频播放 | 久久综合久久综合久久综合 | 国产精品免费看久久久8精臀av | 在线看一级片 | 精品国产一区二区三区免费 | 99精品99| 黄色在线免费观看网址 | 天天射天天射天天射 | 亚洲丝袜一区 | 日韩欧美69 | 亚洲精品久久视频 | 91丨九色丨蝌蚪丨对白 | 日日夜夜中文字幕 | 欧美孕妇与黑人孕交 | 国产资源精品在线观看 | 在线观看电影av | 国产精品久久久久久久久久久久久久 | 精品一二区 | 国产精品久久综合 | 久久久久久免费毛片精品 | 国产成人一区二区在线观看 | 在线导航av | 国产精品久久人 | 一区二区三区日韩在线观看 | 天天干,天天射,天天操,天天摸 | 天天干天天草天天爽 | 97超碰在线人人 | 亚洲手机av| 91av色| 日韩精品五月天 | 综合在线观看色 | 精品国产成人在线 | 成人av一区二区在线观看 | 午夜黄色一级片 | 中文字幕高清在线 | 四虎国产精品永久在线国在线 | 97精品国产一二三产区 | av中文字幕免费在线观看 | 国内一级片在线观看 | 97在线影院| 久久男人免费视频 | 亚洲国产99 | 欧美久久久久久久久中文字幕 | 婷婷五月情 | 国产成人精品aaa | 超碰97免费在线 | 娇妻呻吟一区二区三区 | 日产乱码一二三区别在线 | 五月天九九 | 日本中文字幕在线视频 | 日韩电影在线观看一区二区 | 欧美人体xx | 爱爱av网站| 国产精品国产三级国产不产一地 | 天天草视频 | 一区二区在线影院 | 91免费在线播放 | 西西444www | 草 免费视频 | 日韩精品一区二区三区高清免费 | 99亚洲国产 | 国产成人av电影在线 | 成片免费观看视频 | 久久艹艹| 欧美性护士 | 奇米影视8888 | 亚洲成人国产精品 | 国产综合精品一区二区三区 | 韩国av一区 | 五月婷婷丁香激情 | 九九在线精品视频 | 在线亚洲欧美视频 | 国产午夜亚洲精品 | 日日夜夜综合 | 欧美成人xxxxxxxx | 亚洲成人资源在线观看 | 精品免费观看 | 国产精品自拍在线 | 午夜精品久久久久久久99无限制 | 这里只有精彩视频 | 日日干夜夜爱 | 久久99精品久久久久久三级 | 久久99中文字幕 | 国产一区久久久 | 少妇高潮流白浆在线观看 | 在线电影 你懂得 | 中文视频一区二区 | 亚洲成年人免费网站 | 五月色综合 | 久久免费一级片 | 久久99精品久久久久久久久久久久 | 色视频在线观看免费 | 成人久久18免费 | 伊人久久婷婷 | 超碰大片 | 久久免费资源 | 狠狠狠狠狠色综合 | 精品国产一区二区久久 | 视频在线精品 | 一本一本久久aa综合精品 | 日韩r级电影在线观看 | 精品亚洲免费 | 超碰97中文| 日韩大片在线免费观看 | www.久久色 | 中文字幕电影高清在线观看 | 亚洲精品h | 久热av在线 | 日韩精品一区二区三区在线播放 | 日韩激情小视频 | 国产一区二区三区在线 | 手机成人av在线 | 99精品久久久 | 日韩一区二区三免费高清在线观看 | 亚洲午夜在线视频 | 在线 你懂 | 中文字幕在线观看视频一区二区三区 | 亚洲精品乱码久久久久久 | 欧美日韩后 | 中文乱幕日产无线码1区 | 色99导航| 国产一级淫片免费看 | 久久手机视频 | 亚洲成人av电影 | 日韩电影一区二区三区 | 欧美日韩国产精品爽爽 | 久久香蕉一区 | av永久网址| 99久久影院 | www.69xx| 国产流白浆高潮在线观看 | 国产精彩视频一区 | 玖玖视频免费在线 | 国产专区精品视频 | 婷婷六月天在线 | 日韩中文免费视频 | 9色在线视频 | 好看的国产精品视频 | 欧美一区二区三区在线播放 | 国产亚洲情侣一区二区无 | 日韩女同一区二区三区在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 国产成在线观看免费视频 | se视频网址| av电影亚洲| 伊人天天干 | 99精品电影| 成人小视频在线播放 | 五月婷婷,六月丁香 | 婷婷色在线播放 | 亚洲成a人片77777潘金莲 | 激情网五月天 | 婷婷日韩 | 中文字幕一区二区三区视频 | av免费黄色 | 午夜在线国产 | 成人午夜网 | 国产精品扒开做爽爽的视频 | 色噜噜日韩精品一区二区三区视频 | 欧美日韩亚洲第一页 | 欧美日韩激情视频8区 | 免费观看第二部31集 | 在线播放一区二区三区 | 国产在线黄色 | 久久99国产精品久久 | 欧美精品中文在线免费观看 | 国产日产精品一区二区三区四区的观看方式 | 2019av在线视频 | 99精品观看 | 午夜少妇一区二区三区 | 久久精品欧美一 | 啪一啪在线 | 欧美一区二区三区在线观看 | 四虎免费在线观看 | 欧美日韩一区二区三区在线免费观看 | www.久久色 | 久久午夜国产 | 久久综合狠狠综合久久综合88 | 亚洲一区二区视频 | 亚洲91中文字幕无线码三区 | 成人免费xyz网站 | 亚洲人成影院在线 | 国产91在线 | 美洲 | 一区二区影院 | 久久国产高清视频 | 亚洲视频免费在线观看 | 在线观看成人福利 | 日本韩国精品一区二区在线观看 | 97在线视频免费观看 | 精品一区二区久久久久久久网站 | 九色琪琪久久综合网天天 | 亚洲成熟女人毛片在线 | 美女网站色 | 中文字幕123区| 欧美激情视频一二三区 | av片在线看 | 欧美最猛性xxxxx亚洲精品 | 亚洲精品午夜视频 | 久久精品视频国产 | www五月天 | 五月婷婷久 | 中文字幕中文字幕中文字幕 | 日韩av一区二区在线播放 | 日韩在线视频一区二区三区 | 深夜视频久久 | 四虎国产精品免费 | 国产一级91 | 亚洲视频免费 | 国产精品激情偷乱一区二区∴ | 香蕉视频91 | 国产成人福利在线观看 | 国产精品av免费在线观看 | 98精品国产自产在线观看 | 亚洲成人av片 | 91福利国产在线观看 | 91精品视频在线免费观看 | 日韩综合一区二区 | 手机在线中文字幕 | 韩国三级av在线 | 亚洲精品456在线播放 | 人人干人人艹 | 欧美中文字幕久久 | 91av视频免费在线观看 | 99精品国产兔费观看久久99 | 日韩中文字幕免费视频 | 最新av网站在线观看 | 免费视频91蜜桃 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久6精品 | 色a资源在线| 久久综合九色欧美综合狠狠 | av动图 | 成片人卡1卡2卡3手机免费看 | 日韩精品一区二区三区电影 | 国产美女被啪进深处喷白浆视频 | 成人黄色免费观看 | 欧美性生活一级片 | 日日干夜夜干 | 天天操天天色综合 | 欧美婷婷综合 | 2023亚洲精品国偷拍自产在线 | 国产高清在线视频 | 久久国产精品成人免费浪潮 | 亚洲婷婷丁香 | 在线观看国产www | www99精品| 国产三级在线播放 | 日韩素人在线观看 | 日韩一区二区免费播放 | 欧美激情综合色综合啪啪五月 | 久久久国产精品一区二区三区 | 日韩美精品视频 | 九九九九色 | 九色视频网址 | 国产一区二区高清 | 日韩一区二区三区免费视频 | www.亚洲黄| 五月天色综合 | 久久激情小视频 | 国产免费小视频 | 免费的成人av | 国产 在线 日韩 | 久久精品精品 | 久久精品视频国产 | 看全黄大色黄大片 | 中文字幕一区二区三区精华液 | 狠狠操狠狠干天天操 | 久久婷婷一区 | 在线成人一区 | 中文在线字幕免 | 色99久久 | 成年人免费观看在线视频 | 欧洲色吧| 在线观看亚洲精品视频 | 99久久99热这里只有精品 | 久久综合狠狠狠色97 | 久草视频播放 | 日韩欧美精品在线视频 | 日韩视频欧美视频 | 天天色成人网 | 激情欧美一区二区免费视频 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 日本xxxxav | 国产精品一区二区无线 | 2000xxx影视 | 欧美激情视频在线免费观看 | 免费观看一级视频 | 天天超碰| 日韩欧美在线中文字幕 | 麻豆影视网 | 久草在线观看资源 | 又色又爽又激情的59视频 | 国产精品久久久久婷婷二区次 | 99国产精品久久久久久久久久 | 99热在线这里只有精品 | 久久8 | 午夜在线免费视频 | 国产在线探花 | 久草在线视频网站 | 97超碰成人在线 | 国产黄色av网站 | 超碰在线最新网址 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 午夜视频不卡 | 深夜免费福利网站 | 人人澡超碰碰 | www激情com | 免费看污片 | 精品国产1区2区3区 国产欧美精品在线观看 | 超碰公开在线 | 91精品国产乱码在线观看 | 久久久久久久久免费 | 日本xxxx裸体xxxx17 | 欧美日韩视频精品 | 8090yy亚洲精品久久 | 免费观看一级成人毛片 | 久久免费视频在线观看30 | 在线观看 国产 | 日韩在线视频线视频免费网站 | 中文字幕观看视频 | 成人超碰97 | 婷婷色在线播放 | 久久99精品久久久久婷婷 | 激情网第四色 | 国产亚洲午夜高清国产拍精品 | 色婷婷精品大在线视频 | 久久理论电影网 | av中文字幕在线观看网站 | 国产精品麻豆99久久久久久 | 黄色成人在线观看 | 97爱| 9幺看片 | 天天操伊人 | 中文字幕日本在线 | 欧美另类激情 | 婷婷综合成人 | 精品国产精品久久 | 狠狠躁夜夜躁人人爽超碰91 | 久久久久久美女 | 久久久 精品 | 午夜国产一区二区三区四区 | 国产一级一片免费播放放 | 97在线免费观看视频 | 欧美久久电影 | 美女网站在线观看 | 国产成人333kkk | 欧美激情精品久久 | 三上悠亚在线免费 | 免费男女羞羞的视频网站中文字幕 | 天天天天爱天天躁 | 天天天射 | 中文字幕在线看视频国产中文版 | 国产麻豆果冻传媒在线观看 | 免费看污的网站 | 高清视频一区 | 在线黄频 | 亚洲资源视频 | 久久三级视频 | 一本一道波多野毛片中文在线 | 久久久久久高潮国产精品视 | 国产精品久久免费看 | 欧美日韩国产高清视频 | 精品99久久 | 日韩超碰 | 又黄又色又爽 | 成人四虎影院 | 色噜噜噜 | 欧美激情另类文学 | 综合五月 | 久久免费视频网站 | 国产黄色精品在线 | 性色av免费在线观看 | 最近日本字幕mv免费观看在线 | 97成人在线观看视频 | 2023国产精品自产拍在线观看 | 99r在线观看 | 亚洲精品资源 | 免费91麻豆精品国产自产在线观看 | 啪啪小视频网站 | 美女av免费| 国产在线视频在线观看 | 久久免费视频8 | 亚洲精品国产第一综合99久久 | 超碰激情在线 | 五月婷婷六月丁香 | 国产一区精品在线观看 | 最新久久久 | 成人国产精品久久久 | 中文字幕精品久久 | 97国产| 国产精品一区二区果冻传媒 | 在线国产视频观看 | 91大片网站 | 91人人澡人人爽人人精品 | 91成人免费看 | 久久综合九色综合97婷婷女人 | 日韩高清精品一区二区 | 亚洲欧洲视频 | 日本九九视频 | 日本中文字幕电影在线免费观看 | 4438全国亚洲精品在线观看视频 | 中文字幕你懂的 | 丁香婷婷基地 | 96国产精品视频 | 在线观看成人国产 | 国产黄大片在线观看 | 日日操夜夜操狠狠操 | 夜色.com| 欧美大片www | 五月开心综合 | av色一区 | 日韩午夜精品 | 免费看片日韩 | 国产精品欧美日韩在线观看 | 欧美日韩在线电影 | 亚洲一级电影 | 超碰成人网 | 国产淫a | 国产在线观看网站 | 亚洲人成免费网站 | 九色视频网 | 黄色看片| www蜜桃视频 | 视频在线精品 | 黄色亚洲免费 | 欧美在线视频a | 日韩电影在线一区 | 国产免费中文字幕 | 亚洲视频精选 | 麻豆国产视频下载 | 亚洲成人av片 | 精品久久久久久久久久久久久久久久 | 九九爱免费视频 | 视频二区| 欧美少妇18p| 亚洲精品国偷拍自产在线观看蜜桃 | 日韩精品一区二区三区不卡 | 九九九在线观看 | 91av电影| avsex| 亚洲另类视频在线观看 | 成片免费观看视频999 | 91精品福利在线 | 色wwwww | 国产精品99久久久久久大便 | 久久久久久久久福利 | 欧亚日韩精品一区二区在线 | 97成人免费视频 | 成人av影视在线 | 日韩在线免费高清视频 | 日本一区二区三区免费观看 | 在线观影网站 | www久草 | 亚洲天堂自拍视频 | 超碰久热 | 五月婷婷伊人网 | 久久免费精品一区二区三区 | 久久久久久草 | 国产群p| 中文字幕乱码日本亚洲一区二区 | 日日爱夜夜爱 | 日韩伦理一区二区三区av在线 | 欧美一级片免费在线观看 | 91精品久久久久久久91蜜桃 | 成人av直播 | 91高清不卡 | 一区二区视频电影在线观看 | 超碰97在线资源 | 亚洲另类xxxx| 97人人爽人人 | 九九视频一区 | 国产一级在线观看 | 亚洲国产免费看 | 国产一区二区三区免费在线观看 | 精品一区在线 | 日韩三级中文字幕 | 毛片美女网站 | www.天天操 | 日韩字幕 | 香蕉视频国产在线观看 | 国产伦理一区 | 亚洲精品在线观看中文字幕 | 五月天六月色 | 国产原创在线 | 国产亚洲精品电影 | 国产精品欧美久久久久天天影视 | 天天色天天操天天爽 | 国产精品久久久久久久久久久久午夜片 | 婷婷久操 | 蜜臀av免费一区二区三区 | 久久视频二区 | 久久精品99国产 | 国产高清中文字幕 | 国产在线超碰 | 亚洲三级av| 久 久久影院 | 超碰.com | 免费在线观看a v | 日韩大片在线免费观看 | 91观看视频| 婷婷伊人综合亚洲综合网 | 久久综合99| 精品国产一区二区三区av性色 | 国产一区二区精品久久 | 欧美色伊人 | 911免费视频 | 激情视频在线观看网址 | 亚洲综合在线观看视频 | 激情久久久久久久久久久久久久久久 | 看黄色91 | 亚洲精品久久久久www | 在线观看午夜 | 日韩欧美在线观看一区二区三区 | 在线亚洲欧美视频 | 亚洲免费小视频 | 丝袜少妇在线 | 久久精品91视频 | 国产精品国产三级国产不产一地 | 欧美日韩一区二区在线观看 | 精品99免费| 欧美性生爱 | 中文字幕色婷婷在线视频 | 香蕉视频色 | 在线观看一级 | 天天干天天拍天天操天天拍 | 粉嫩av一区二区三区四区 | www久 | 天天操天天干天天爽 | 成人a v视频 | 超碰在线天天 | 久久免费精品国产 | 亚洲欧洲精品在线 | 欧美日韩在线观看一区二区 | 九九天堂| 久操久| 在线激情影院一区 | 中文av字幕在线观看 | 日韩在线观看小视频 | 亚洲欧美日韩中文在线 | 玖玖视频精品 | 久久国内精品99久久6app | 欧美日韩在线电影 | 久久久免费 | 日韩xxxxxxxxx| 一区二区三区四区在线免费观看 | 在线视频欧美精品 | 一区二区三区日韩视频在线观看 | 欧美在线视频一区二区三区 | 久草精品在线播放 | 免费在线激情视频 | 久久免费电影网 | 九九热av | 一区二区三区韩国免费中文网站 | 在线观看理论 | 免费看一级黄色大全 | 国产在线精品一区二区 | 欧美性精品| 国产中文字幕av | 久久精品99久久久久久2456 | 中文字幕免费在线 | 天天射天天爱天天干 | 久久久一本精品99久久精品66 | 888av| 超碰九九 | 青草视频在线免费 | 69精品人人人人 | 91福利视频在线 | 日韩精品亚洲专区在线观看 | 91爱爱免费观看 | 亚洲一区网站 | 91免费在线看片 | 毛片网站在线观看 | 久久精品9 | 免费观看一级特黄欧美大片 | 国产精品久久久久av福利动漫 | 国产乱老熟视频网88av | 国产中文在线视频 | 国产午夜三级一区二区三桃花影视 | 日韩理论电影在线 | 在线免费观看羞羞视频 | 亚洲色影爱久久精品 | 97精品在线 | 在线小视频你懂的 | 狠狠狠狠狠狠狠狠 | 九九免费在线观看视频 | 成人va天堂 | 成年人网站免费在线观看 | 日韩高清免费无专码区 | 亚洲精品网址在线观看 | 国产糖心vlog在线观看 | 97超碰成人在线 | 啪嗒啪嗒免费观看完整版 | 日韩欧美高清在线观看 | 最新日韩视频在线观看 | 国产91粉嫩白浆在线观看 | 九色福利视频 | 国产精品1区2区3区 久久免费视频7 | 欧美午夜寂寞影院 | 中文字幕免费在线看 | 中文字幕在线播放av | 国产不卡视频在线 | 在线成人小视频 | 久久精品久久久久久久 | 激情综合六月 | 黄色av一区二区三区 | 亚洲国产精品视频在线观看 | 福利电影久久 | 久久精品网址 | 国产视频色 | 毛片www| 国产美女免费观看 | 99久久久国产精品免费99 | 日本一区二区三区免费观看 | 韩国av免费观看 | 国产亚洲视频系列 | 最新色站| 日韩精品免费在线播放 | 人人干网站 | 波多野结衣一区二区三区中文字幕 | 久草精品视频 | 五月激情五月激情 | 久久黄色网页 | 免费色视频网址 | 亚洲第一区在线观看 | 国产乱码精品一区二区蜜臀 | 97国产精品亚洲精品 | 国产黄色免费看 | 最近日韩免费视频 | 国产午夜亚洲精品 | 中文字幕影视 | 国产精品入口麻豆www | 亚洲特级毛片 | 四虎影视成人永久免费观看视频 | 超碰在线免费福利 | 午夜av在线| 国产二区av | 精品久久久久久久久久久久久久久久 | 国产精品1区 | 中文字幕在线观看国产 | 久久r精品 | 在线观看久 | 久久精品人 | 成人在线视频论坛 | 精品久久久久一区二区国产 | 国产美女精品人人做人人爽 | 美女免费视频观看网站 | 亚洲午夜不卡 | 精品国产伦一区二区三区观看体验 | 三级动图 | 精品一区三区 | 99re热精品视频 | 欧美激情在线网站 | 日日干天天 | 久久久久久久免费看 | 毛片网站在线 | 三级黄免费看 | 亚洲国产人午在线一二区 | 婷婷av色综合 | 欧美色综合久久 | 全久久久久久久久久久电影 | 日韩欧美在线综合网 | 丝袜精品视频 | 在线日本看片免费人成视久网 | 中文字幕在线看视频国产 | 久久九九久久精品 | 97精品国自产拍在线观看 | 2021av在线 | 久久草草热国产精品直播 | 五月视频| 六月丁香在线观看 | 久久96国产精品久久99软件 | 亚洲视频六区 | 在线观看国产区 | 国产精品 9999 | 亚洲欧洲国产精品 | av高清网站在线观看 | 香蕉久久国产 | 免费网站色 | 国产一区二区久久精品 | 亚洲精品视频在线免费播放 | 韩国一区二区av | 免费在线观看91 | 国产精品入口a级 | 九九激情视频 | 国内久久久久久 | 91 在线视频| 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国产无遮挡猛进猛出免费软件 | bbb搡bbb爽爽爽 | 中文字幕 国产视频 | 在线免费高清视频 | 97国产精品久久 | 婷婷激情五月 | 中国一级片视频 | 丁香六月在线观看 | 中文国产在线观看 | 一区二区三区四区免费视频 | 国产日韩精品一区二区三区在线 | 中文字幕 国产精品 | av解说在线观看 | 欧美视频18| 一级黄色片在线 | 国产精品久久久久久一区二区三区 | 久久久久久伊人 | 天天插一插 | 中文资源在线观看 | 国产一级片免费播放 | 久久精品一区二区三区四区 | 91污污| 久草在在线| 久久久久久综合 | 亚洲 欧洲 国产 精品 | 国产一区福利在线 | 在线一区电影 | 国产精品一二 | 色中文字幕在线观看 | 视频在线观看99 | 2020天天干天天操 | 日韩高清在线一区二区 | 国产精品一区二区在线观看 | 视频 国产区 | 亚洲人视频在线 | 国产系列 在线观看 | 麻豆视频网址 | 日韩色一区二区三区 | 精品国产午夜 | 99热在线看 | 亚洲精品五月 | 国内精品久久久 | 色永久免费视频 | 天天色天天草天天射 | 天天射天天射天天 | 亚洲中字幕 | 日韩免费视频线观看 | 91久久国产自产拍夜夜嗨 | 国产做a爱一级久久 | 久草资源在线观看 | 国产精品成人av电影 | 久久尤物电影视频在线观看 | 国产成在线观看免费视频 | 国产丝袜制服在线 | 国产免费一区二区三区最新6 | 九九热1 | 久久久久久久国产精品视频 | 欧美天天射 | 亚洲狠狠 | 欧美日韩国产精品一区二区亚洲 | 国产永久免费 | 久草免费在线 | 国产精品无av码在线观看 | 九九视频精品在线 | 亚洲精品女人 | 久久国产精品一区二区 | 天天狠狠 | av成人亚洲| 国产中文字幕视频在线观看 | 亚洲涩涩网 | 久久精品国产精品 | a黄色| 麻豆免费观看视频 | 国产成人久久av977小说 | 91在线精品观看 | 黄色网在线免费观看 | 一区二区精品视频 | 成人欧美亚洲 | 性色av免费看 | 久久黄色精品视频 | 中文字幕色站 | 嫩模bbw搡bbbb搡bbbb | 亚洲精品在线观看不卡 | 久久久国产在线视频 | 天天操天天色天天射 | 精品在线亚洲视频 | 久久精品欧美 | 日韩在线视频线视频免费网站 | 国产玖玖视频 | 亚洲五月六月 | 一级国产视频 | 午夜婷婷在线观看 | 欧美日韩国产免费视频 | 一级黄色毛片 | 国产精品va在线观看入 | 99久久99久久精品免费 | 久久久久免费看 | 欧美一级免费高清 | 久久综合网色—综合色88 | 高清在线一区二区 | 成人在线观看日韩 | 成人免费毛片aaaaaa片 | 国产精品乱码一区二三区 | av午夜电影 | 91九色视频国产 | 99在线热播| 午夜久久网站 | 久久精品视频在线 | 天天看天天操 | 91av免费在线观看 | 97视频免费观看2区 亚洲视屏 | 国产视频18 | 狠狠狠狠干| 亚洲人xxx| 精品国产91亚洲一区二区三区www | 视频在线亚洲 | av免费观看网站 | 久久草在线视频国产 | 国产成人精品一区二区三区网站观看 | 成人精品电影 | 中文字幕你懂的 | 成人国产网址 | 在线视频专区 | 国产主播大尺度精品福利免费 | 九九免费观看视频 | 亚洲激情 | 九九热视频在线免费观看 | 亚洲国产一区二区精品专区 | 欧美一级免费片 | 一区二区视频播放 | 欧美污网站 | 国产精品av免费观看 | 在线观看日韩专区 | 久久久久国产精品www | 精品免费一区二区三区 | 亚洲精品高清在线观看 | 亚洲国产精品传媒在线观看 | 国产精品免费久久久久 | 午夜精品99久久免费 | 黄色免费观看网址 | 色综合天天视频在线观看 | 99精品欧美一区二区三区 | 天天射夜夜爽 | 免费久久视频 | 日本黄色大片儿 | 日韩三级视频在线观看 | 97人人精品 | www五月天婷婷| 久艹在线免费观看 | 国产精品video爽爽爽爽 | 国产精品久久久久久超碰 | 久久久精品国产一区二区三区 | 日韩免费av在线 | 日韩欧美精品在线 | 国产一区二区在线免费观看 | 97在线资源| 亚洲成av人片一区二区梦乃 | 精品美女在线观看 | 奇人奇案qvod | 四虎影视成人永久免费观看亚洲欧美 | 99久久夜色精品国产亚洲96 | 日韩精品免费一线在线观看 | 天天插狠狠干 | www.色com| 欧美国产亚洲精品久久久8v | 亚洲三级毛片 | 日韩精品久久久久久久电影竹菊 | 亚洲成人精品国产 | 97久久久免费福利网址 | 国产精品视频专区 | 99在线精品视频在线观看 | 一本一本久久a久久精品综合小说 | 亚洲精品国产精品乱码不99热 | 亚洲国产日韩欧美 | 国产中文 | 天天激情综合 | 大荫蒂欧美视频另类xxxx | 久久人人爽人人爽人人 | 国产精品99久久久精品免费观看 | 丁香婷婷综合激情五月色 | 日韩字幕在线 | 国产精品video爽爽爽爽 | 亚洲国产wwwccc36天堂 | 美女视频黄频 | 国产色综合 | 中文视频在线 | 欧美一区二区三区免费看 | 国产高清在线观看av | 天天射天天干天天爽 | 在线中文字幕网站 | 激情五月六月婷婷 | 精品久久久久久久久久 | 亚洲成人精品在线观看 | 99热99热| 成人av在线电影 |