注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Slow.More√BLOG

Fast?

 
 
 

日志

 
 

windows数据类型  

2008-06-24 13:06:17|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源msdn

Windows Data Types

The data types supported by Microsoft® Windows® are used to define function return values, function and message parameters, and structure members. They define the size and meaning of these elements. For more information about the underlying C/C++ data types, see Data Type Ranges.

The following table contains the following types: character, integer, Boolean, pointer, and handle. The character, integer, and Boolean types are common to most C compilers. Most of the pointer-type names begin with a prefix of P or LP. Handles refer to a resource that has been loaded into memory.

For more information about handling 64-bit integers, see Large Integers.

Type Description
ATOM Atom. For more information, see Atoms.

This type is declared in WinDef.h as follows:

typedef WORD ATOM;
BOOL Boolean variable (should be TRUE or FALSE).

This type is declared in WinDef.h as follows:

typedef int BOOL;
BOOLEAN Boolean variable (should be TRUE or FALSE).

This type is declared in WinNT.h as follows:

typedef BYTE BOOLEAN;
BYTE Byte (8 bits).

This type is declared in WinDef.h as follows:

typedef unsigned char BYTE;
CALLBACK Calling convention for callback functions.

This type is declared in WinDef.h as follows:

#define CALLBACK __stdcall
CHAR 8-bit Windows (ANSI) character. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef char CHAR;
COLORREF Red, green, blue (RGB) color value (32 bits). See COLORREF for information on this type.

This type is declared in WinDef.h as follows:

typedef DWORD COLORREF;
CONST Variable whose value is to remain constant during execution.

This type is declared in WinDef.h as follows:

#define CONST const
DWORD 32-bit unsigned integer.

This type is declared in WinDef.h as follows:

typedef unsigned long DWORD;
DWORDLONG 64-bit unsigned integer.

This type is declared in WinNT.h as follows:

typedef ULONGLONG DWORDLONG;
DWORD_PTR Unsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows. )

This type is declared in BaseTsd.h as follows:

typedef ULONG_PTR DWORD_PTR;
DWORD32 32-bit unsigned integer.

This type is declared in BaseTsd.h as follows:

typedef unsigned int DWORD32;
DWORD64 64-bit unsigned integer.

This type is declared in BaseTsd.h as follows:

typedef unsigned __int64 DWORD64;
FLOAT Floating-point variable.

This type is declared in WinDef.h as follows:

typedef float FLOAT;
HACCEL Handle to an accelerator table.

This type is declared in WinDef.h as follows:

typedef HANDLE HACCEL;
HALF_PTR Half the size of a pointer. Use within a structure that contains a pointer and two small fields.

This type is declared in Basetsd.h as follows:

#ifdef _WIN64   typedef int HALF_PTR;  #else   typedef short HALF_PTR;  #endif
HANDLE Handle to an object.

This type is declared in WinNT.h as follows:

typedef PVOID HANDLE;
HBITMAP Handle to a bitmap.

This type is declared in WinDef.h as follows:

typedef HANDLE HBITMAP;
HBRUSH Handle to a brush.

This type is declared in WinDef.h as follows:

typedef HANDLE HBRUSH;
HCOLORSPACE Handle to a color space.

This type is declared in WinDef.h as follows:

#if(WINVER >= 0x0400)   typedef HANDLE HCOLORSPACE;  #endif
HCONV Handle to a dynamic data exchange (DDE) conversation.

This type is declared in Ddeml.h as follows:

typedef HANDLE HCONV;
HCONVLIST Handle to a DDE conversation list.

This type is declared in Ddeml.h as follows:

typedef HANDLE HCONVLIST;
HCURSOR Handle to a cursor.

This type is declared in WinDef.h as follows:

typedef HICON HCURSOR;
HDC Handle to a device context (DC).

This type is declared in WinDef.h as follows:

typedef HANDLE HDC;
HDDEDATA Handle to DDE data.

This type is declared in Ddeml.h as follows:

typedef HANDLE HDDEDATA;
HDESK Handle to a desktop.

This type is declared in WinDef.h as follows:

typedef HANDLE HDESK;
HDROP Handle to an internal drop structure.

This type is declared in ShellApi.h as follows:

typedef HANDLE HDROP;
HDWP Handle to a deferred window position structure.

This type is declared in WinUser.h as follows:

typedef HANDLE HDWP;
HENHMETAFILE Handle to an enhanced metafile.

This type is declared in WinDef.h as follows:

typedef HANDLE HENHMETAFILE;
HFILE Handle to a file opened by OpenFile, not CreateFile.

This type is declared in WinDef.h as follows:

typedef int HFILE;
HFONT Handle to a font.

This type is declared in WinDef.h as follows:

typedef HANDLE HFONT;
HGDIOBJ Handle to a GDI object.

This type is declared in WinDef.h as follows:

typedef HANDLE HGDIOBJ;
HGLOBAL Handle to a global memory block.

This type is declared in WinDef.h as follows:

typedef HANDLE HGLOBAL;
HHOOK Handle to a hook.

This type is declared in WinDef.h as follows:

typedef HANDLE HHOOK;
HICON Handle to an icon.

This type is declared in WinDef.h as follows:

typedef HANDLE HICON;
HINSTANCE Handle to an instance.

This type is declared in WinDef.h as follows:

typedef HANDLE HINSTANCE;
HKEY Handle to a registry key.

This type is declared in WinDef.h as follows:

typedef HANDLE HKEY;
HKL Input locale identifier.

This type is declared in WinDef.h as follows:

typedef HANDLE HKL;
HLOCAL Handle to a local memory block.

This type is declared in WinDef.h as follows:

typedef HANDLE HLOCAL;
HMENU Handle to a menu.

This type is declared in WinDef.h as follows:

typedef HANDLE HMENU;
HMETAFILE Handle to a metafile.

This type is declared in WinDef.h as follows:

typedef HANDLE HMETAFILE;
HMODULE Handle to a module. The value is the base address of the module.

This type is declared in WinDef.h as follows:

typedef HINSTANCE HMODULE;
HMONITOR Handle to a display monitor.

This type is declared in WinDef.h as follows:

if(WINVER >= 0x0500) typedef HANDLE HMONITOR;
HPALETTE Handle to a palette.

This type is declared in WinDef.h as follows:

typedef HANDLE HPALETTE;
HPEN Handle to a pen.

This type is declared in WinDef.h as follows:

typedef HANDLE HPEN;
HRESULT Return code used by interfaces. It is zero upon success and nonzero to represent an error code or status information.

This type is declared in WinNT.h as follows:

typedef LONG HRESULT;
HRGN Handle to a region.

This type is declared in WinDef.h as follows:

typedef HANDLE HRGN;
HRSRC Handle to a resource.

This type is declared in WinDef.h as follows:

typedef HANDLE HRSRC;
HSZ Handle to a DDE string.

This type is declared in Ddeml.h as follows:

typedef HANDLE HSZ;
HWINSTA Handle to a window station.

This type is declared in WinDef.h as follows:

typedef HANDLE WINSTA;
HWND Handle to a window.

This type is declared in WinDef.h as follows:

typedef HANDLE HWND;
INT 32-bit signed integer.

This type is declared in WinDef.h as follows:

typedef int INT;
INT_PTR Signed integer type for pointer precision. Use when casting a pointer to an integer to perform pointer arithmetic.

This type is declared in BaseTsd.h as follows:

#if defined(_WIN64)    typedef __int64 INT_PTR;   #else    typedef int INT_PTR;  #endif
INT32 32-bit signed integer.

This type is declared in BaseTsd.h as follows:

typedef signed int INT32;
INT64 64-bit signed integer.

This type is declared in BaseTsd.h as follows:

typedef signed __int64 INT64;
LANGID Language identifier. For more information, see Locales.

This type is declared in WinNT.h as follows:

typedef WORD LANGID;
LCID Locale identifier. For more information, see Locales.

This type is declared in WinNT.h as follows:

typedef DWORD LCID;
LCTYPE Locale information type. For a list, see Locale and Language Information.

This type is declared in WinNls.h as follows:

typedef DWORD LCTYPE;
LGRPID Language group identifier. For a list, see EnumLanguageGroupLocales.

This type is declared in WinNls.h as follows:

typedef DWORD LGRPID;
LONG 32-bit signed integer.

This type is declared in WinNT.h as follows:

typedef long LONG;
LONGLONG 64-bit signed integer.

This type is declared in WinNT.h as follows:

#if !defined(_M_IX86)   typedef __int64 LONGLONG;   #else   typedef double LONGLONG;  #endif
LONG_PTR Signed long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic.

This type is declared in BaseTsd.h as follows:

#if defined(_WIN64)   typedef __int64 LONG_PTR;   #else   typedef long LONG_PTR;  #endif
LONG32 32-bit signed integer.

This type is declared in BaseTsd.h as follows:

typedef signed int LONG32;
LONG64 64-bit signed integer.

This type is declared in BaseTsd.h as follows:

typedef __int64 LONG64;
LPARAM Message parameter.

This type is declared in WinDef.h as follows:

typedef LONG_PTR LPARAM;
LPBOOL Pointer to a BOOL.

This type is declared in WinDef.h as follows:

typedef BOOL far *LPBOOL;
LPBYTE Pointer to a BYTE.

This type is declared in WinDef.h as follows:

typedef BYTE far *LPBYTE;
LPCOLORREF Pointer to a COLORREF value.

This type is declared in WinDef.h as follows:

typedef DWORD *LPCOLORREF;
LPCSTR Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef __nullterminated CONST CHAR *LPCSTR;
LPCTSTR An LPCWSTR if UNICODE is defined, an LPCSTR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE   typedef LPCWSTR LPCTSTR;   #else   typedef LPCSTR LPCTSTR;  #endif
LPCVOID Pointer to a constant of any type.

This type is declared in WinDef.h as follows:

typedef CONST void *LPCVOID;
LPCWSTR Pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CONST WCHAR *LPCWSTR;
LPDWORD Pointer to a DWORD.

This type is declared in WinDef.h as follows:

typedef DWORD *LPDWORD;
LPHANDLE Pointer to a HANDLE.

This type is declared in WinDef.h as follows:

typedef HANDLE *LPHANDLE;
LPINT Pointer to an INT.

This type is declared in WinDef.h as follows:

typedef int *LPINT;
LPLONG Pointer to a LONG.

This type is declared in WinDef.h as follows:

typedef long *LPLONG;
LPSTR Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CHAR *LPSTR;
LPTSTR An LPWSTR if UNICODE is defined, an LPSTR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE   typedef LPWSTR LPTSTR;  #else   typedef LPSTR LPTSTR;  #endif
LPVOID Pointer to any type.

This type is declared in WinDef.h as follows:

typedef void *LPVOID;
LPWORD Pointer to a WORD.

This type is declared in WinDef.h as follows:

typedef WORD *LPWORD;
LPWSTR Pointer to a null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef WCHAR *LPWSTR;
LRESULT Signed result of message processing.

This type is declared in WinDef.h as follows:

typedef LONG_PTR LRESULT;
PBOOL Pointer to a BOOL.

This type is declared in WinDef.h as follows:

typedef BOOL *PBOOL;
PBOOLEAN Pointer to a BOOL.

This type is declared in WinNT.h as follows:

typedef BOOLEAN *PBOOLEAN;
PBYTE Pointer to a BYTE.

This type is declared in WinDef.h as follows:

typedef BYTE *PBYTE;
PCHAR Pointer to a CHAR.

This type is declared in WinNT.h as follows:

typedef CHAR *PCHAR;
PCSTR Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CONST CHAR *PCSTR;
PCTSTR A PCWSTR if UNICODE is defined, a PCSTR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE   typedef LPCWSTR PCTSTR;  #else   typedef LPCSTR PCTSTR;  #endif
PCWSTR Pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CONST WCHAR *PCWSTR;
PDWORD Pointer to a DWORD.

This type is declared in WinDef.h as follows:

typedef DWORD *PDWORD;
PDWORDLONG Pointer to a DWORDLONG.

This type is declared in WinNT.h as follows:

typedef DWORDLONG *PDWORDLONG;
PDWORD_PTR Pointer to a DWORD_PTR.

This type is declared in BaseTsd.h as follows:

typedef DWORD_PTR *PDWORD_PTR;
PDWORD32 Pointer to a DWORD32.

This type is declared in BaseTsd.h as follows:

typedef DWORD32 *PDWORD32;
PDWORD64 Pointer to a DWORD64.

This type is declared in BaseTsd.h as follows:

typedef DWORD64 *PDWORD64;
PFLOAT Pointer to a FLOAT.

This type is declared in WinDef.h as follows:

typedef FLOAT *PFLOAT;
PHALF_PTR Pointer to a HALF_PTR.

This type is declared in Basetsd.h as follows:

#ifdef _WIN64   typedef HALF_PTR *PHALF_PTR;  #else   typedef HALF_PTR *PHALF_PTR;  #endif
PHANDLE Pointer to a HANDLE.

This type is declared in WinNT.h as follows:

typedef HANDLE *PHANDLE;
PHKEY Pointer to an HKEY.

This type is declared in WinDef.h as follows:

typedef HKEY *PHKEY;
PINT Pointer to an INT.

This type is declared in WinDef.h as follows:

typedef int *PINT;
PINT_PTR Pointer to an INT_PTR.

This type is declared in BaseTsd.h as follows:

typedef INT_PTR *PINT_PTR;
PINT32 Pointer to an INT32.

This type is declared in BaseTsd.h as follows:

typedef INT32 *PINT32;
PINT64 Pointer to an INT64.

This type is declared in BaseTsd.h as follows:

typedef INT64 *PINT64;
PLCID Pointer to an LCID.

This type is declared in WinNT.h as follows:

typedef PDWORD PLCID;
PLONG Pointer to a LONG.

This type is declared in WinNT.h as follows:

typedef LONG *PLONG;
PLONGLONG Pointer to a LONGLONG.

This type is declared in WinNT.h as follows:

typedef LONGLONG *PLONGLONG;
PLONG_PTR Pointer to a LONG_PTR.

This type is declared in BaseTsd.h as follows:

typedef LONG_PTR *PLONG_PTR;
PLONG32 Pointer to a LONG32.

This type is declared in BaseTsd.h as follows:

typedef LONG32 *PLONG32;
PLONG64 Pointer to a LONG64.

This type is declared in BaseTsd.h as follows:

typedef LONG64 *PLONG64;
POINTER_32 32-bit pointer. On a 32-bit system, this is a native pointer. On a 64-bit system, this is a truncated 64-bit pointer.

This type is declared in BaseTsd.h as follows:

#if defined(_WIN64)  #define POINTER_32 __ptr32  #else  #define POINTER32  #endif
POINTER_64 64-bit pointer. On a 64-bit system, this is a native pointer. On a 32-bit system, this is a sign-extended 32-bit pointer.

Note that it is not safe to assume the state of the high pointer bit.

This type is declared in BaseTsd.h as follows:

#define POINTER_64 __ptr64
POINTER_SIGNED A signed pointer.

This type is declared in BaseTsd.h as follows:

#define POINTER_SIGNED __sptr
POINTER_UNSIGNED An unsigned pointer.

This type is declared in BaseTsd.h as follows:

#define POINTER_UNSIGNED __uptr
PSHORT Pointer to a SHORT.

This type is declared in WinNT.h as follows:

typedef SHORT *PSHORT;
PSIZE_T Pointer to a SIZE_T.

This type is declared in BaseTsd.h as follows:

typedef SIZE_T *PSIZE_T;
PSSIZE_T Pointer to a SSIZE_T.

This type is declared in BaseTsd.h as follows:

typedef SSIZE_T *PSSIZE_T;
PSTR Pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CHAR *PSTR;
PTBYTE Pointer to a TBYTE.

This type is declared in WinNT.h as follows:

typedef TBYTE *PTBYTE;
PTCHAR Pointer to a TCHAR.

This type is declared in WinNT.h as follows:

typedef TCHAR *PTCHAR;
PTSTR A PWSTR if UNICODE is defined, a PSTR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE   typedef LPWSTR PTSTR;  #else typedef LPSTR PTSTR;  #endif
PUCHAR Pointer to a UCHAR.

This type is declared in WinDef.h as follows:

typedef UCHAR *PUCHAR;
PUHALF_PTR Pointer to a UHALF_PTR.

This type is declared in Basetsd.h as follows:

#ifdef _WIN64   typedef UHALF_PTR *PUHALF_PTR;  #else   typedef UHALF_PTR *PUHALF_PTR;  #endif
PUINT Pointer to a UINT.

This type is declared in WinDef.h as follows:

typedef UINT *PUINT;
PUINT_PTR Pointer to a UINT_PTR.

This type is declared in BaseTsd.h as follows:

typedef UINT_PTR *PUINT_PTR;
PUINT32 Pointer to a UINT32.

This type is declared in BaseTsd.h as follows:

typedef UINT32 *PUINT32;
PUINT64 Pointer to a UINT64.

This type is declared in BaseTsd.h as follows:

typedef UINT64 *PUINT64;
PULONG Pointer to a ULONG.

This type is declared in WinDef.h as follows:

typedef ULONG *PULONG;
PULONGLONG Pointer to a ULONGLONG.

This type is declared in WinDef.h as follows:

typedef ULONGLONG *PULONGLONG;
PULONG_PTR Pointer to a ULONG_PTR.

This type is declared in BaseTsd.h as follows:

typedef ULONG_PTR *PULONG_PTR;
PULONG32 Pointer to a ULONG32.

This type is declared in BaseTsd.h as follows:

typedef ULONG32 *PULONG32;
PULONG64 Pointer to a ULONG64.

This type is declared in BaseTsd.h as follows:

typedef ULONG64 *PULONG64;
PUSHORT Pointer to a USHORT.

This type is declared in WinDef.h as follows:

typedef USHORT *PUSHORT;
PVOID Pointer to any type.

This type is declared in WinNT.h as follows:

typedef void *PVOID;
PWCHAR Pointer to a WCHAR.

This type is declared in WinNT.h as follows:

typedef WCHAR *PWCHAR;
PWORD Pointer to a WORD.

This type is declared in WinDef.h as follows:

typedef WORD *PWORD;
PWSTR Pointer to a null- terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef WCHAR *PWSTR;
SC_HANDLE Handle to a service control manager database. For more information, see SCM Handles.

This type is declared in WinSvc.h as follows:

typedef HANDLE SC_HANDLE;
SC_LOCK Lock to a service control manager database. For more information, see SCM Handles.

This type is declared in WinSvc.h as follows:

typedef LPVOID SC_LOCK;
SERVICE_STATUS_HANDLE Handle to a service status value. For more information, see SCM Handles.

This type is declared in WinSvc.h as follows:

typedef HANDLE SERVICE_STATUS_HANDLE;
SHORT Short integer (16 bits).

This type is declared in WinNT.h as follows:

typedef short SHORT;
SIZE_T The maximum number of bytes to which a pointer can point. Use for a count that must span the full range of a pointer.

This type is declared in BaseTsd.h as follows:

typedef ULONG_PTR SIZE_T;
SSIZE_T Signed SIZE_T.

This type is declared in BaseTsd.h as follows:

typedef LONG_PTR SSIZE_T;
TBYTE A WCHAR if UNICODE is defined, a CHAR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE   typedef WCHAR TBYTE;  #else   typedef unsigned char TBYTE;  #endif
TCHAR A WCHAR if UNICODE is defined, a CHAR otherwise.

This type is declared in WinNT.h as follows:

#ifdef UNICODE   typedef WCHAR TCHAR;  #else   typedef char TCHAR;  #endif
UCHAR Unsigned CHAR.

This type is declared in WinDef.h as follows:

typedef unsigned char UCHAR;
UHALF_PTR Unsigned HALF_PTR. Use within a structure that contains a pointer and two small fields.

This type is declared in Basetsd.h as follows:

#ifdef _WIN64   typedef unsigned int UHALF_PTR;  #else   typedef unsigned short UHALF_PTR;  #endif
UINT Unsigned INT.

This type is declared in WinDef.h as follows:

typedef unsigned int UINT;
UINT_PTR Unsigned INT_PTR.

This type is declared in BaseTsd.h as follows:

#if defined(_WIN64)   typedef unsigned __int64 UINT_PTR;  #else   typedef unsigned int UINT_PTR;  #endif
UINT32 Unsigned INT32.

This type is declared in BaseTsd.h as follows:

typedef unsigned int UINT32;
UINT64 Unsigned INT64.

This type is declared in BaseTsd.h as follows:

typedef usigned __int 64 UINT64;
ULONG Unsigned LONG.

This type is declared in WinDef.h as follows:

typedef unsigned long ULONG;
ULONGLONG 64-bit unsigned integer.

This type is declared in WinNT.h as follows:

#if !defined(_M_IX86)   typedef unsigned __int64 ULONGLONG;  #else   typedef double ULONGLONG  #endif
ULONG_PTR Unsigned LONG_PTR.

This type is declared in BaseTsd.h as follows:

#if defined(_WIN64)   typedef unsigned __int64 ULONG_PTR;  #else   typedef unsigned long ULONG_PTR;  #endif
ULONG32 Unsigned LONG32.

This type is declared in BaseTsd.h as follows:

typedef unsigned int ULONG32;
ULONG64 Unsigned LONG64.

This type is declared in BaseTsd.h as follows:

typedef unsigned __int64 ULONG64;
USHORT Unsigned SHORT.

This type is declared in WinDef.h as follows:

typedef unsigned short USHORT;
USN Update sequence number (USN).

This type is declared in WinNT.h as follows:

typedef LONGLONG USN;
VOID Any type.

This type is declared in WinNT.h as follows:

#define VOID void
WCHAR 16-bit Unicode character. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef wchar_t WCHAR;
WINAPI Calling convention for system functions.

This type is declared in WinDef.h as follows:

#define WINAPI __stdcall
WORD 16-bit unsigned integer.

This type is declared in WinDef.h as follows:

typedef unsigned short WORD;
WPARAM Message parameter.

This type is declared in WinDef.h as follows:

typedef UINT_PTR WPARAM;

 

  评论这张
 
阅读(890)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018