ACCESSWindows_Program_Via_C_Translate_Win32编程的背景知识/基础知识_包括核心输入输出机制介绍

Some Basic Background Story of The Win32 APIs

Win32 API背景故事/背景知识

The Win32 application programming interface (API) provides building blocks used by applications written for the Microsoft Windows operating system family.

It defines the 32-bit members of the Windows family from the programmer’s point of view and you will find out later, 64-bit members also included.  Some members of the Windows family use the entire Win32 API, while others use subsets.

 

Win32 API提供在微软windows操作系统平台上编制应用程序的函数功能块,Win32 API从应用程序程序员的角度定义32位windows家族平台下应用程序系统接口,在以后的windows版本将将能够看到64位windows平台的WinAPI(注:实际上在XP平台已经有64位版本的WinAPI)。一些windows平台使用全部的Win32 API函数,而一些windows版本则使用Win32 API的子集(注:在工业控制和移动应用中大家熟知的WinCE使用的就是Win32 API的子集,西门子的MP系列触摸屏使用的就是一个子集,在里面编程可以使用VBscript脚本)。

 

The Microsoft Foundation Class Library (MFC) encapsulates, or "wraps," most of the Win32 API but not all.

微软基础类库封装了Win32 API,但是不是所有的API函数都封装到了MFC.

 

MFC versions 2.x and earlier encapsulated the 16-bit Windows API.  MFC supplies classes representing key Windows objects, such as windows, dialog boxes, brushes, pens, and fonts.

2.x版本或更早版本的MFC封装了部分16位的WinAPI, MFC支持windows面向对象编程的中的对象的概念,例如窗口类、对话框类、画刷类、画笔类和字体类等。

 

The member functions of these classes wrap most of the important Win32 API functions associated with the encapsulated object.

这些类的成员函数封装了与这些对象相关的大部分重要的Win32 API函数。

 

The MFC class member function calls the Win32 API function, and might add functionality.

MFC类程序员调用Win32 API函数,并且可能自封装一些实现其他功能的成员函数。

 

The Active Template Library (ATL) is a set of template-based C++ classes that let you create small, fast Component Object Model (COM) objects.  ATL wraps Win32 and C run-time library APIs, but does not wrap Win32 to the extent that MFC does.

ATL类库是C++模板类库的一个子集,它让你可以创建小而快速的对象组建模型的对象。 ATL封装了Win32和C语言运行时类库函数,但是和MFC不一样的是它没有封装一些给予Win32的MFC扩展。

 

With Visual C++, you can program for Windows using either:

C or C++ and the Win32 API.

C++ and MFC or

C++ and ATL.

通过Visual C++你能够使用下下列模型来编制应用程序:

1、C语言、C++或者Win32 API。

2、C++或者MFC

3、C++或者 ATL。

 

For information about Win32 programming we normally refer to Win32 API and the documentation is available in the Platform SDK.

当提及Win32编程时,我们通常描述的是基于Win32 API和平台SDK的相关文档。

 

In the previous Module we have been introduced to some of the Microsoft implementation of the C using the C Run-time (CRT) libraries.  In this Module we will explore the Win32 APIs with C.

在前面的板块我们已经介绍过基于C和C语言运行时库CRT来完成一些微软Windows的应用实现,这里我们将介绍利用Win32和C来的应用实现。

 

This API is designed for use by C/C++ programmers but in this Module we still drop the Windows graphical user interface and message-driven related things, the MFC and ATL.  Don’t worry; C/C++ codes are reusable in the MFC and ATL.

API是为使用C/C++的程序员设计的,但是在这里我们讨论windows的图形用户界面接口和事件驱动机制,以及MFC和ATL相关的知识。不必担心,C/C++的代码可以在MFC和ATL中复用(注:这里指的是可以交叉使用)。

 

Whatever it is, from C/C++ view, these APIs are just functions.  As usual, we are going to learn how to use those functions.

然而从C/C++的观点来看,API只是函数,和通常一样我们将学习如何使用这些函数。

 

We will learn several categories of the available APIs.  For others, please refer to the Platform SDK documentations.

接下来我们将学习集中不同种类的API函数,为了更好的使用这些函数,或者需要更多的信息,请参考微软提供的平台SDK文档。

 

First of all let start with the most basic information required to fully understand how to use the Win32 APIs: the Windows data types, header files issue and handles.

首先,让我们来看看要完全学会使用Win32API的最基本的内容:windows数据类型、windows头文件和句柄。

Other than the standard data types that you have found when doing the C/C++ programming, there is a lot more in Win32 programming.

这些内容不仅仅是标准的C/C++的数据结构类型,而是为Win32编程设计的数据类型。

 

Because of the update issue and the various Windows OS versions, using the same Windows header file doesn’t mean you will be provided with the same functionalities.  This issue will be solved by using macros.

由windows操作系统的本子不断的创新,当您以不同之windows版本下使用同一的头文件与同一之Win32 API函数名时可能会见落实不同之函数功能,这些函数在少数版本及或许会见使用宏实现(注:这里以VC++ 里面跟库底落实相关,至于在调用过程遭到是调用宏还是调用函数,请查询库的相关兑现文档)

 

 

Later on we will concentrate on the file management functions that available in Win32 APIs by collecting the required and related information and then try building simple working programs.

通下我们用学Win32 API中关于文件系统管理之系内容,我们以尝试收集相关的音讯,并且尝试建立我们温馨的实例应用程序实体。

 

These functions used to deal with volumes, disks, directories (including paths) and files management.  The file system used in the discussion is NTFS.

这些函数实现卷标管理、磁盘管理、目录管理暨文书管理,这里我们的座谈还以依据NTFS文件系统。

 

The not so understandable stories about Windows file system and storage can be found Supplementary for Windows file system.

于一切过程中将不再额外地叙述windows文件系统和存储的相关的基础知识。

 

There is no new constructs you will find in this Module except functions, arrays, pointers and structures.

这边用不再描述除了函数、数组、指针和组织体外的新的数据类型。

 

Windows Data Types

Windows数据类型

 

The data types supported by Microsoft Windows are used to define function return values, function and message parameters, structure members and variables.  They define thesize and meaning of these elements.

叫微软windows平台支持之数据类型用阿里定义:函数的归值、函数和信息参数、结构体的组织成员以及便面。 Windows数据类型定义这些因素的高低与含义信息。

 

The following Table contains types of character, integer, Boolean, pointer, and handle.  The character, integer, and Boolean types are common to most C/C++ compilers.  The types also include the 64 bits size.

下表例举了有些数据类型如:字符型、整型、布尔型、指针型和语句柄类型。字符、整型和布尔色为多数之C/C++编译器支持。这些数据类型中还包64各项之数据类型。

 

If you have noticed, many types actually are derived from the basic types with new name using the typedef or #define and some are specific for the graphic functions.

唯恐你见面注意到,很多数据类型具有同样之基类型,他们只不过是由此typedef机制定义之数据类型的号(注:严格来说不克算得数据类型别名,应该就是新的数据类型);或者也图形界面下编程函数使用要之所以#define定义的庞

 

Most of the pointer-type names begin with a prefix of P or LP (long pointer) and handle with H.

大多数之指针类型的花色名前都加以了P或者LP(长指针)前缀,而句柄类型则加以了H前缀。

 

Handles refer to a resource that has been loaded into memory and will be discussed in another Module.

句柄标识被系统加载到内存区域之一中资源,在后的模块将会晤特地的牵线句柄这种数据类。

 

Well, we have so many data types here :o).

These various data types defined in several header files such as windef.h, basetsd.h, ddeml.h, shellapi.h, winuser.h, winsvc.h and winnt.h.

啊哦,在windows环境下面来无比多的数据类型, :o).

说明

 

Keyword

关键字

Description

描述

ATOM

原子类型

Atom.  This type is declared in windef.h as follows: typedef WORD ATOM;

原子类型,在windef.h 头文件定义。

概念语法:

           typedef  WORD  ATOM;

BOOL

布尔项目

Boolean variable (should be TRUE or FALSE).  This type is declared in windef.h as follows: typedef int BOOL;

布尔型变量(变量取值: TRUE和FALSE), 在峰文件windef.h里面定义。

概念语法:

          typedef  int BOOL;

BOOLEAN

布尔路

 

Boolean variable (should be TRUE or FALSE).  This type is declared in winnt.h as follows:  typedef BYTE BOOLEAN;

布尔型变量(变量取值: TRUE和FALSE), 在峰文件windef.h里面定义。

概念语法:

             Typedef BYTE BOOLEAN;

BYTE

字节类型

Byte (8 bits).  This type is declared in windef.h as follows: typedef unsigned char BYTE;

字节类型,8各数据大幅度。 在头文件windef中定义。

概念语法:

      typedef  unsigned char BYTE;

CALLBACK

扭动调函数标识

Calling convention for callback functions.  This type is declared in windef.h as follows:  #define CALLBACK __stdcall

扭曲调函数调用规则指示符,知识函数参数的调用规则(这个貌似由编译器定义),在峰文件windef.h中声称。

声称语法如下:

     #difine  CALLBACK __stdcall

CHAR

字符类型

8-bit Windows (ANSI) character.  This type is declared in winnt.h as follows:

typedef char CHAR;

8号的ANSI字符类型,在峰文件winnt.h中定义。

概念语法:

          typedef char CHAR;

COLORREF

水彩数据类型

Red, green, blue (RGB) color value (32 bits).  This type is declared in windef.h as follows:  typedef DWORD COLORREF;

根据红、绿、蓝三本色(RGB)定义的数据结构,32啊数号宽度。在windef.h头文件被定义。

概念语法:

     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

代表变量的值在运作中只念之修饰符,在windef.h头文件被宣称。

宣示语法:

      #define CONST const

DWORD

双许路

32-bit unsigned integer.  This type is declared in windef.h as follows:

typedef unsigned long DWORD;

32各无符号整型,在头文件windef.h中定义。

概念语法:

         typedef unsigned long DWORD;

DWORDLONG

累加双字类型

64-bit unsigned integer.  This type is declared in winnt.h as follows:

typedef ULONGLONG DWORDLONG;

64号无符号整型,在winnt.h 头文件被定义。

概念语法:

        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;精确指针Unsigned long类型,通常以用一个指针类型转换为长整型数据类型时以。通常以64各类windows里面用32各项参数扩展位64各是用,在头文件basetsd.h中定义。

概念语法:

         typedef ULONG_PTR DWORD_PTR;

DWORD32

32位无符号整型。

32-bit unsigned integer.  This type is declared in basetsd.h as follows:

typedef unsigned int DWORD32;

32号无符号整型,在头文件basetsd.h中定义。

概念语法:

        typedef unsigned int DWORD32;

DWORD64

64各无符号整型

64-bit unsigned integer.  This type is declared in basetsd.h as follows:

typedef unsigned __int64 DWORD64;

64个无符号整型,在basetsd.h头文件被定义

概念语法:

       typedef unsigned __int64 DWORD64;

FLOAT

浮点类型

Floating-point variable.  This type is declared in windef.h as follows: typedef float FLOAT;

浮点型变量类型,在windef.h中定义。

概念语法:

      typedef float FLOAT;

HACCEL

加速器表句柄

Handle to an accelerator table.  This type is declared in windef.h as follows:

accelerator table.

加速器表句柄,在windef头文件被定义。

概念语法:

       accelerator table.

HANDLE

句柄

Handle to an object.  This type is declared in winnt.h as follows: typedef PVOID HANDLE;

对象句柄,在winnt头文件被定义。

概念语法:

    typedef PVOID HANDLE;

 

HBITMAP

位图对象句柄

Handle to a bitmap.  This type is declared in windef.h as follows: typedef HANDLE HBITMAP;

位图对象句柄,在windef头文件被定义。

概念语法:

     typedef HANDLE HBITMAP;

HBRUSH

画刷词柄

Handle to a brush.  This type is declared in windef.h as follows: typedef HANDLE HBRUSH;

画刷对象句柄,在windef头文件被定义。

概念语法:

        typedef HANDLE HBRUSH;

HCOLORSPACE

水彩空间定义

Handle to a color space.  This type is declared in windef.h as follows:

if(WINVER >= 0x0400)

typedef HANDLE HCOLORSPACE;

水彩空间对象句柄,在头文件windef中定义。

概念语法:

     if(WINVER >= 0x0400)

           typedef HANDLE HCOLORSPACE;

HCONV

动态数据交换对象句柄。

Handle to a dynamic data exchange (DDE) conversation.  This type is declared in ddeml.h as follows:  typedef HANDLE HCONV;

动态数据交换对象句柄,在峰文件ddeml中定义。

概念语法:

    typedef HANDLE HCONV;

HCONVLIST

动态数据交换对象列表句柄

Handle to a DDE conversation list.  This type is declared in ddeml.h as follows:

typedef HANDLE HCONVLIST;

动态数据交换列表句柄;在头文件ddeml中定义。

概念语法:

    typedef HANDLE HCONVLIST;

HCURSOR

光标句柄

Handle to a cursor.  This type is declared in windef.h as follows:

typedef HICON HCURSOR;

光标句子柄,在头文件windef中定义。

概念语法:

     typedef HICON HCURSOR;  

HDC

设备内容对象句柄

Handle to a device context (DC).  This type is declared in windef.h as follows:

typedef HANDLE HDC;

装备的情句柄,在峰文件windef中定义。

概念语法:

    typedef HANDLE HDC;

HDDEDATA

动态交换数据句柄

Handle to DDE data.  This type is declared in ddeml.h as follows:

typedef HANDLE HDDEDATA;

动态交换数据句柄,在头文件ddeml中定义。

概念语法:

   typedef HANDLE HDDEDATA; 

HDESK

桌面对象句柄

Handle to a desktop.  This type is declared in windef.h as follows:

typedef HANDLE HDESK;

桌面对象句柄,在头文件windef中定义。

概念语法:

   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;

增强型metafile对象句柄,在头文件windef中定义。

概念语法:

      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;

透过函数OpenFile打开的公文之句柄,不是CreateFile函数创建的文书句柄。在头文件windef中定义。

概念语法:

     typedef int HFILE;

HFONT

书对象句柄

Handle to a font.  This type is declared in windef.h as follows: typedef HANDLE HFONT;

字对象句柄。在头文件windef中定义,

概念语法:

    typedef HANDLE HFONT;

HGDIOBJ

Handle to a GDI object.  This type is declared in windef.h as follows:

typedef HANDLE HGDIOBJ;

图形设备接口对象句柄,在头文件windef中定义。

概念语法:

        typedef HANDLE HGDIOBJ;   

HGLOBAL

全局内存块句子柄

Handle to a global memory block.  This type is declared in windef.h as follows:

typedef HANDLE HGLOBAL;

全局内存块对象句柄,在峰文件windef中定义。

概念语法:

      typedef HANDLE HGLOBAL;

HHOOK

HOOK钩子句柄

Handle to a hook.  This type is declared in windef.h as follows: typedef HANDLE HHOOK;

Hook钩子对象句柄,在头文件windef中定义。

概念语法:

       typedef HANDLE HHOOK;

HICON

贪图标句柄

Handle to an icon.  This type is declared in windef.h as follows: typedef HANDLE HICON;

图标句柄,在头文件windef中定义。

概念语法:

    typedef HANDLE HICON;   

HINSTANCE

Handle to an instance.  This type is declared in windef.h as follows: typedef HANDLE HINSTANCE;

实例句柄,在峰文件windef中定义。

概念语法:

       typedef HANDLE HINSTANCE;

HKEY

Handle to a registry key.  This type is declared in windef.h as follows: typedef HANDLE HKEY;

报表项桩句柄,在峰文件windef中定义。

概念语法:

     typedef HANDLE HKEY;

HKL

Input locale identifier.  This type is declared in windef.h as follows:

typedef HANDLE HKL;

地方输入标识符句柄,在头文件windef中定义。

概念语法:

     typedef HANDLE HKL;

HLOCAL

Handle to a local memory block.  This type is declared in windef.h as follows:

typedef HANDLE HLOCAL;

局部内存块对象句柄,在头文件windef中定义。

概念语法:

    typedef HANDLE HLOCAL;

HMENU

Handle to a menu.  This type is declared in windef.h as follows: typedef HANDLE HMENU;

食谱句柄,在峰文件windef中定义。

概念语法:

      typedef HANDLE HMENU;    

HMETAFILE

Handle to a metafile.  This type is declared in windef.h as follows: typedef HANDLE HMETAFILE;

Metafile对象句柄,在头文件windef中定义。

概念语法:

   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 integral 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;

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.  This type is declared in winnt.h as follows: typedef WORD LANGID;

LCID

Locale identifier.  This type is declared in winnt.h as follows: typedef DWORD LCID;

LCTYPE

Locale information type.  This type is declared in winnls.h as follows: typedef DWORD LCTYPE;

LGRPID

Language group identifier.  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:

typedef __int64 LONGLONG;

#else

typedef double LONGLONG;

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;

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 *LPBOOL;

LPBYTE

Pointer to a BYTE.  This type is declared in windef.h as follows: typedef BYTE *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.  This type is declared in winnt.h as follows: typedef 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;

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.  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.  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;

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.  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.  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;

PCWSTR

Pointer to a constant null-terminated string of 16-bit Unicode characters.  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;

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

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.  This type is declared in basetsd.h as follows:

#define POINTER_64 __ptr64

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.  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;

PUCHAR

Pointer to a UCHAR.  This type is declared in windef.h as follows: typedef UCHAR *PUCHAR;

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.  This type is declared in winnt.h as follows:  typedef WCHAR *PWSTR;

SC_HANDLE

Handle to a service control manager database.  This type is declared in winsvc.h as follows:  typedef HANDLE SC_HANDLE;

SC_LOCK

Lock to a service control manager database.  This type is declared in winsvc.h as follows:  typedef LPVOID SC_LOCK;

SERVICE_STATUS_HANDLE

Handle to a service status value.  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;

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;

UCHAR

Unsigned CHAR.  This type is declared in windef.h as follows: typedef unsigned char UCHAR;

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;

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 unsigned __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:

typedef unsigned __int64 ULONGLONG;

#else

typedef double ULONGLONG

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;

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.  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;

 

Table 1: Windows data types.

 

Large Integers

大整数

This topic describes the support for operations on large (64-bit) integers provided by 32-bit Windows.  Applications can multiply signed or unsigned 32-bit integers, generating 64-bit results, by using the Int32x32To64() and UInt32x32To64() functions.  Applications can shift bits in 64-bit values to the left or right by using the Int64ShllMod32(),Int64ShraMod32(), and Int64ShrlMod32() functions.  These functions provide logical and arithmetic shifting.

这里讨论32各项windows对64各项整型数据的支持。应用程序通过下Int32X32To64()函数或者UInt32X32To64()函数能够以有记号、无符号的32各类整型数据相乘得到64各项之结果。应用程序同样能够透过行使Int64ShllMod32()函数和Int64ShraMod32()函数和Int64ShrlMod32()函数进行活动操作;这些函数提供逻辑和算术移位操作功能。

 

Applications can also multiply and divide 32-bit values in a single operation by using the MulDiv() function.  Although the result of the operation is a 32-bit value, the function stores the intermediate result as a 64-bit value, so that information is not lost when large 32-bit values are multiplied and divided.

应用程序可以使用MulDiv()函数在同不成运算过程遭到落实32各类数据的乘法和除法操作。虽然这函数的返回值是一个32个的价值,但是因为以函数内部使用的凡64号数据开展测算,因此于算过32各类长度的数值是不见面丢掉数据精度。

 

Some Windows functions use the LARGE_INTEGER structure to represent 64-bit signed integer values, and the ULARGE_INTEGER structure to specify 64-bit unsigned integer values.  Your C compiler may support 64-bit integers natively.  For example, Microsoft® Visual C++® supports the __int64 sized integer type.

局部windows 函数使用LARGE_INTEGER结构来支撑64位产生记号整型,而下ULARGE_INTEGER结构来支持64各无符号整型。你的C编译器可能置支持64员之整型数据;例如微软的Visual C++支持__int64号长度的整型。

 

The New Data Types

新数据类型

There are three classes of new data types: fixed-precision data types, pointer-precision types, and specific-precision pointers.  These types were added to the development environment (specifically, to basetsd.h) to allow developers to prepare for 64-bit Microsoft® Windows® well before its introduction.  These new types were derived from the basic C-language integer and long types, so they work in existing code.  Therefore, use these data types in your code now, test your code on 32-bit Windows, and recompile with the 64-bit compiler when 64-bit Windows is available.

在windows中提供了3种新的数据类型: 定精度数据类型、指针指向型数据结构和指定数据精度指针类型。这些数据类型在开发环境中(有basetsd.h头文件提供定义支持)增加是为了允许开发者开发64位windows应用程序做准备,这些数据类型派生与基本C语言数据类型,这些数据类型已经在使用。因此可以在你windows 32位平台的代码中使用这些数据类型,当你使用64位windows的时候重新编译你的代码。

 

There is an additional benefit to adopting these new data types now: it will make your code more robust.  To use these data types, you must scan your code for potentially unsafe pointer usage, polymorphism, and data definitions.  To be safe, use the new types.  For example, when a variable is of type ULONG_PTR, it is clear that it will be used for casting pointers for arithmetic operations or polymorphism.  It is not possible to indicate such usage directly by using the existing data types.  You can do this by using derived type naming or Hungarian notation, but both techniques are prone to errors.

现在使用这些新的数据类型还有一个好处,它可以使你的代码更加健壮。为了使用这些数据类型,你必须排查你代码中潜在的不安全的指针、 polymorphism、和数据定义。为了代码安全,请使用新的数据类型。例如,当定义一个ULONG_PTR类型变量时,很显然他将在用于数据类型转换或者 polymorphism中将指针进行转换成目标数据类型。利用现有的数据结构或者类型就不能这么清楚的指明这一点。你能通过使用内置的数据类型或者 Hungarian notation,但是两种方法都容易产生错误。

Fixed Precision

必然精度数据

Fixed-precision data types are the same length in both 32- and 64-bit Windows. To help you remember this, their precision is part of the name of the data type.  The following are the fixed-precision data types.

肯定精度数据以32个或64员windows中拥有同等之多少位宽度。为了便于记忆,这些多少的精度(注:数据小幅)是数据类型的等同有些。下表例举了定精度的数据类型:

Type

Definition

DWORD32

32-bit unsigned integer

DWORD64

64-bit unsigned integer

INT32

32-bit signed integer

INT64

64-bit signed integer

LONG32

32-bit signed integer

LONG64

64-bit signed integer

UINT32

Unsigned INT32

UINT64

Unsigned INT64

ULONG32

Unsigned LONG32

ULONG64

Unsigned LONG64

 

Table 2: Fixed precision data types

 

Pointer Precision

指南针精度/指针长度

As the pointer precision changes (that is, as it becomes 32 bits on 32-bit Windows and 64 bits with 64-bit Windows), these data types reflect the precision accordingly.  Therefore, it is safe to cast a pointer to one of these types when performing pointer arithmetic; if the pointer precision is 64 bits, the type is 64 bits.  The count types also reflect the maximum size to which a pointer can refer.  The following are the pointer-precision and count types.

当指针精度/指针长度改变,这些数据类型的尺寸就自行改变(当以32号windows时这些数据类型位32各类,在64各类windows时凡64各项长度);因此当将指针转化为这些数据类型后开展多少运算是平安的,当指针精度是64号时,转化后的数据类型也是64各项之。计数器类型同样影响一个指南针能引用的极度要命数量小幅。下表例举了有指南针长度类型及计数器类类型。

Type

Definition

DWORD_PTR

Unsigned long type for pointer precision.

HALF_PTR

Half the size of a pointer.  Use within a structure that contains a pointer and two small fields.

INT_PTR

Signed integral type for pointer precision.

LONG_PTR

Signed long type for pointer precision.

SIZE_T

The maximum number of bytes to which a pointer can refer.  Use for a count that must span the full range of a pointer.

SSIZE_T

Signed SIZE_T.

UHALF_PTR

Unsigned HALF_PTR.

UINT_PTR

Unsigned INT_PTR.

ULONG_PTR

Unsigned LONG_PTR.

 

Table 3: Pointer precision

 

Specific Pointer-Precision Types

指定长度指针类型

There are also new pointer types that explicitly size the pointer.  Be cautious when using pointers in 64-bit code: If you declare the pointer using a 32-bit type, the operating system creates the pointer by truncating a 64-bit pointer.  All pointers are 64 bits on 64-bit Windows.

平等是显示指出数据位宽的新的指针类型。当于64号代码中运用这些数据类型的当儿如果留意:如果您声明一个32各长度的指针变量,操作系统将活动截取为32位之指针。 记住在64各类系统受拥有的指针变量都是64各长度/位富有。

Type

Definition

POINTER_32

A 32-bit pointer. On 32-bit Windows, this is a native pointer.  On 64-bit Windows, this is a truncated 64-bit pointer.

32位指针,在32号系统受,是缺省长度指针,而于64各项系统,是一个64各指针经系统截取后底指针。

POINTER_64

A 64-bit pointer. On 64-bit Windows, this is a native pointer.  On 32-bit Windows, this is a sign-extended 32-bit pointer.  Note that it is not safe to assume the state of the high pointer bit.

64号指针,在64各类系统中凡指针缺省长。在32各系统遭到,是自32个指针扩展的出来的指针。注意:主观假定一个指南针的高位状态是一个请勿安全之一言一行。

 

Table 4: Another pointer precision types.

 

Multiple Versions of Windows Header Files

Windows头文件的本子

Header files for the Windows API enable you to create 32- and 64-bit applications that run on various Microsoft Windows versions.

WindowsAPI相关的条文件允许而创造于不同的windows版本上允的32各类还是64各项的应用程序。

 

They use data types that allow you to build both 32- and 64-bit versions of your application from a single source code base.

这些API使用不同之数据类型,允许你用平等卖代码建立可以32各类和64各类本windows下运作的次序。(注:通过数量列扩展应用程序的应用范围,就是数据类型)

 

Microsoft Visual C++ includes copies of the Windows header files that were current at the time Visual C++ was released.  Therefore, if you install updated header files from an SDK, you may end up with multiple versions of the Windows header files on your computer.

以Visual C++包括她为宣告时的windows API相关的腔文件。因此当你用一个SDK开发包升级而的Visual C++时,你恐怕会见遇到不少不等版本的windows API相关的条文件。

 

If you do not sure that you are using the latest version of the SDK header files, you will receive the following error code when compiling code that uses features that were introduced after Visual C++ was released: error C2065: undeclared identifier.

倘没保证您以编译时行使的凡时版本的SDK头文件,而于您的代码中使了Visual C++发布时介绍的新特征,那么当编译代码的经过遭到而拿可能看到如下的错误代码:error C2065: undeclared identifier.

 

 

Certain functions that depend on a particular version of Windows are declared using conditional code.  This enables you to use the compiler to detect whether your application uses functions that are not supported on its target version(s) of Windows.

少数依赖让特定的windows版本的函数使用规范编译代码来拓展宣示;这样保证你的编译器能检测你的代码中是不是了使用了目标Windows系统不支持的函数。

 

To compile an application that uses these functions, you must define the appropriate macros. Otherwise, you will receive the C2065 error message.

The following table indicates the common macros you must define to target each major operating system release.

为当一个应用程序中以这些函数,你必定义合适的高大。否则你以见面看编译器报C2065错误。下面的发明指出了公必定义之来适合你的操作系统发布之主要版本号通用宏。

 

Individual header files may use different macros; therefore, if header files related compilation problems occur, check the header file that contains the definition for conditional definitions directly.

今非昔比的头文件或者会见就所以不同之宏大,因此如果头文件来编辑错误,那么就算直接检查包含条件宏的腔文件。

 

Minimum system required

最为小系统要求

Macros to define

宏定义

Windows Server 2003 family

_WIN32_WINNT >= 0x0502

WINVER >= 0x0502

Windows XP

_WIN32_WINNT >= 0x0501

WINVER >= 0x0501

Windows 2000

_WIN32_WINNT >= 0x0500

WINVER >= 0x0500

Windows NT 4.0

_WIN32_WINNT >= 0x0400

WINVER >= 0x0400

Windows Me

_WIN32_WINDOWS = 0x0500

WINVER >= 0x0500

Windows 98

_WIN32_WINDOWS >= 0x0410

WINVER >= 0x0410

Windows 95

_WIN32_WINDOWS >= 0x0400

WINVER >= 0x0400

Internet Explorer 6.0

_WIN32_IE >= 0x0600

Internet Explorer 5.6

_WIN32_IE >= 0x0560

Internet Explorer 5.01, 5.5

_WIN32_IE >= 0x0501

Internet Explorer 5.0, 5.0a, 5.0b

_WIN32_IE >= 0x0500

Internet Explorer 4.01

_WIN32_IE >= 0x0401

Internet Explorer 4.0

_WIN32_IE >= 0x0400

Internet Explorer 3.0, 3.01, 3.02

_WIN32_IE >= 0x0300

 

Table 5:  Macros for different Windows header file versions and different Windows OS.

说明5 不同的windows操作系统及见仁见智版本的体系会里不同之宏定义

流动:从这里可以视,微软经过宏定义来支配版本信息

Some features introduced in the latest version of Windows may be added to a service pack for a previous version of Windows.  Therefore, to target a service pack, you may need to define _WIN32_WINNT with the value for the next major operating system release.

局部每当高版本Windows的特色可通过SP升级补丁的当亚版本的Windows中以,因此对此一个SP升级包或要定义 _WIN32_WINNT 宏来适应下一个揭晓版的Windows主版本号。

 

For example, the GetDllDirectory() function was introduced in Windows Server 2003 and is conditionally defined if _WIN32_WINNT is 0x0502 or greater.  This function was also added to Windows XP SP1.  Therefore, if you were to define _WIN32_WINNT 0x0501 to target Windows XP, you would miss features that are defined in Windows XP SP1.

例如,GetDllDirectory函数在Windows Server 2003里面,如果_WIN32_WINNT宏定义代表的价值过等于0X0502,那么其就受定义。 同样这个函数在WinXP SP1中一致可用。 因此如果您曾经定义使用于WinXP的_WIN32_WINNT宏,那么XP SP1的一部分特征将非可用。

 

You can define these symbols by using the #define statement in each source file, or by specifying the /D compiler option supported by Visual C++.

乃可当列一个来自文件文件之头部用#define预处理指令来定义这些号(这里因: 宏),或者经VC++ IDE环境支持的 /D 的编译器选项来支持即庞大扩展功能。

 

For Visual C++ 7.0:  To specify compiler options, go to the Projects menu and click Properties.

对于 VC++ 7.0,为了设置编译器编译选项,那么通过 工程——》属性菜单来进行设置。 

 

For Visual C++ 6.0:  To specify compiler options, go to the Projects menu and click Settings, then select the C/C++ tab.

对VC++ 6.0, 为了设置编译器编译选项,那么通过 工程——》设置 打开装对话框,然后选择C/C++标签页进行安装。

 

Windows System Error Codes

Windows系统错误代码

 

The error codes returned by a function are not part of the Windows API specification and can vary by operating system or device driver.  For this reason, there are functions whose documentation does not include a list of error codes that can be returned.

归来错误代码的函数不是WindowsAPI的平有的,并且函数的返回值可能随操作系统的更动或硬件装备差而更改。 由于是原因,这些函数的相干文档并没有摆这些函数应该归什么价。

 

You should call the GetLastError() function immediately when a function’s return value indicates that such a call will return useful data.  That is because some functions call SetLastError() with a zero when they succeed, wiping out the error code set by the most recently failed function.

当您的函数调用会回一个老关键之价值的时候,你应该立即调用GetLastError()函数来获得函数的归来状态,那是坐一些函数在成功施行时见面调用SetLastError函数来设定函数错误状态全局存储空间,这样虽见面盖最后调用失败的函数的错误代码。(注: 就是以防止错误代码在被利用之前改变,最好以调用重要函数之后立刻调用一下GetLastError函数获取函数执行情况的消息)

 

Most functions that set the thread’s last error code value set it when they fail; a few functions set it when they succeed.

大多数函数会当履行破产后设定其执行线程的错误代码值,只发生多少有的函数会当履成功时设置错误代码值。

 

Function failure is typically indicated by a return value error code such as zero, NULL, or –1.  Some functions call SetLastError() under conditions of success.

Error codes are 32-bit values (bit 31 is the most significant bit).  Bit 29 is reserved for application-defined error codes; no system error code has this bit set.

突出的指令函数执行错误的返回值是例如0、NULL或-1. 一些函数会于成之后调用SetLastError函数;错误代码是一个32各项之返回值(D31 位尤其要)。D29各是为应用程序自定义错误代码保留的, 系统错误代码不会见设置D29立等同号。

(注: 也就是说用户可设置D29这同各项来指示用户用定义的错误类型)

 

If you are defining an error code for your application, set this bit to one.  That indicates that the error code has been defined by an application, and ensures that your error code does not conflict with any error codes defined by the system.

万一您得打定义应用程序的错误代码,那么你得设置D29当即同样各项; 这即证实函数返回的错误代码已经于应用程序重定义过,你必确保应用程序自定义之错误代码不跟系统定义的缺省错误代码冲突。

 

A complete list of error codes provided by the operating system can be found at Windows error codes.  To obtain an error string for system error codes, you can use theFormatMessage() function.

好透过Windows Error Codes可以查看完的关于windows操作系统定义之错误代码。你可调用FormatMessage函数来以错误代码转换成为你用之有关函数返回错误原因的字符串信息。

 

Windows Objects and Handles

Windows对象和语句柄

 

In Windows, an object is a data structure that represents a system resource, such as a file, thread, or graphic image. So, in Windows we are dealing with objects.

当Windows下,对象就是一个结构体,它标志系统资源,例如文件、线程、图像等。因此在Windows下我们处理的是目标。

 

An application cannot directly access (communicate or interact with) object data or the system resource that an object represents.

应用程序不能够直接看对象的多少要系统资源对象。

 

Instead, an application must obtain an object’s handle, which will be use to access, examine or modify the system resource.

相反的,应用程序必须先抱一个靶的句柄,应用程序这个句子柄来访问、检查以及改动系统资源。

 

Each handle has an entry in an internally maintained table.  These entries contain the addresses of the resources (memory addresses?) and the means to identify the resource type.

诸一样句子柄在系保护的系统资源表中都对应一个入口点。这个入口点信息包含资源的地址(是内存地址吗?)并且它们还指示出资源的类。

 

Windows Object Categories

Windows对象类型/种类

In Windows, system provides three categories of objects: user, graphics device interface (GDI), and kernel.

于Windows系统中,操作系统提供了3深种对象:用户对象、GDI对象以及水源对象。

 

The system uses:

User objects to support window management.

GDI objects to support graphics, and  Kernel objects to support memory management, process execution, and interprocess communications (IPC).

系利用:

1、 用户对象来支持窗口管理。

2、 GDI对象来支持图形。

3、 内核对象来支持内存管理、进程执行和过程中通讯。

 

The following Tables are the list of the Windows object categories and in this Tutorial we will focus on some of the kernel objects。

下表例举了windows对象的档次,并且于即时无异省咱们将讨论一些关于基本对象的情节。

 

User object

用户对象

Icon, Caret, Cursor, Dynamic Data Exchange (DDE) conversation, Hook, Accelerator table, Menu, Window, Window position.

图标、光标、动态数据交换、钩子、加速器表、菜单、窗口和窗口位置。

 

Graphic Device Interface (GDI) object

GDI对象

Bitmap, Brush, Device Context (DC), Enhanced metafile, Enhanced-metafile DC, Font, Memory DC, Metafile, Metafile DC, Palette, Region, Pen and extended pen.

 

位图、画刷、设备内容、增强metafile、增强metafile设备内容、内存映像文件、MeteFile等

 

Kernel object

Access token, Change notification, Communications device, Console input, Console screen buffer, Desktop, Event, Event log, File, File mapping, Heap, Job, Mailslot, Module, Mutex, Pipe, Process, Semaphore, Socket, Thread, Timer, Timer queue, Window station, Update resource, Timer-queue timer.

看信令、控制高输入、控制高缓存、桌面、事件、事件日志、文件、文件映像文件、堆、作业、模块、互斥对象、管道、进程、套接字、线程、定时器、定时器队列、

 

Table 6:  Windows object categories.

Window是目标类别

 

Handle and Object Functions

句柄和对象函数

 

The following functions are used with handles and objects.

下面的例举了有的与句柄和目标下有关的函数

Function

Description

GetHandleInformation()

获取句柄信息

Retrieves certain properties of an object handle.

得有对象句柄特定的音讯。

SetHandleInformation()

安装句柄信息

Sets certain properties of an object handle.

设置有句柄的性能

CloseHandle()

关句柄

Closes an open object handle.

闭馆一个开辟对象的句柄/ 撤销一个目标句柄

DuplicateHandle()

复制句柄

Duplicates an object handle.

复制一个对象句柄。

 

Table 7:  Handle and object functions.

句柄和目标函数

As an example for information collection, the following Table lists the needed information in order to use the GetHandleInformation() function.

下是一个有关收集句柄信息的示范。 表中罗列了动GetHandleInformation函数所待的信。

 

 

Information

信息

Description

描述/ 解释

The function

函数

GetHandleInformation().

The use

函数作用

Retrieves certain properties of an object handle.

回去一个对象句柄的习性信息

The prototype

函数原型

BOOL GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags);

Example

示例

HANDLE hFile;

DWORD lpdwFlags[100];

 

hFile = CreateFile(…);

GetHandleInformation(hFile, lpdwFlags);

The parameters

参数

hObject – [in] Handle to an object whose information is to be retrieved.  You can specify a handle to one of the following types of objects: access token, event, file, file mapping, job, mailslot, mutex, pipe, printer, process, registry key, semaphore, serial communication device, socket, thread, or waitable timer.

In Windows Server 2003, Windows XP/2000, this parameter can also be a handle to a console input buffer or a console screen buffer.

 

hObject-[in]: 需要获取信息的靶子的句柄。你可以各之参数传递下列对象的语句柄: 访问信令、事件、文件、文件映像文件、作业、互斥对象、管道、打印机、进程、注册表键、串行通信设备、套接字、线程或 定时器。

每当Windows Server 2003、Windows XP/2000,这个参数还可以是决定高输入缓存或者控制高屏幕缓存。

(注: 目前多数系统的,字符界面输入还是缓冲型的)

 

lpdwFlags – [out] Pointer to a variable that receives a set of bit flags that specify properties of the object handle.  The following values are defined:

HANDLE_FLAG_INHERIT – If this flag is set, a child process created with the bInheritHandles parameter ofCreateProcess() set to TRUE will inherit the object handle.

HANDLE_FLAG_PROTECT_FROM_CLOSE – If this flag is set, calling the CloseHandle() function will not close the object handle.

 

lpdwFlagstaff-[out] 变量指针,指针指向的变量是一个各旗标, 通过位旗标来指示句柄对象的属性。下面是部分预定义值:

 

HANDLE_FLAG_INHERIT:  如果此装置了这位旗标,那么表示经CreateProcess函数创建的子进程对象将继承父亲进程的目标句柄的特色。

 

HANDLE_FLAG_PROTECT_FROM_CLOSE: 如果安了此位旗标,那么以调用CloseHandle函数的时段以未能够正常撤销对象句柄。

 

 

The return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.  To get extended error information, call GetLastError().

 

使此函数成功实行,那么回回值是一个非零值。

只要函数执行破产,那么用回来0. 如果欲取更多之错误信息,可以调用GetLastError函数。

 

The header file

<windows.h>

头文件:  windows.h

 

Table 8:  GetHandleInformation() information.

GetHandleInformation函数的采用办法

From the information in the previous Table, the following program example shows how to obtain an object handle (file) and the use of the GetHandleInformation() function.

因上面表格描述的信,下面的代码示例展示了什么行使GetHandleInformation函数和怎样取得一个文书对象的句柄。

 

#include <windows.h>

#include <stdio.h>

 

int main()

{

// handle for file

HANDLE hFile;

// file and path

char fname[30] = “c:\\testfile.txt”;

DWORD lpdwFlags[100];

 

hFile = CreateFile(fname,                       // file to be opened

                GENERIC_WRITE,                  // open for writing

                FILE_SHARE_WRITE,            // share for writing

                NULL,                                         // default security

                CREATE_ALWAYS,                // create new file only

                FILE_ATTRIBUTE_NORMAL |FILE_ATTRIBUTE_ARCHIVE | SECURITY_IMPERSONATION,

                     // normal file archive and impersonate client

                NULL);                                         // no attr. template

if(hFile == INVALID_HANDLE_VALUE)

    printf(“Could not open %s file, error %d\n”, fname, GetLastError());

printf(“File’s HANDLE is OK!\n”);

BOOL test = GetHandleInformation(hFile, lpdwFlags);

printf(“The return value is %d, error %d\n”, test, GetLastError());

CloseHandle(hFile);

DeleteFile(fname);

return 0;

}

 

A sample output:

 

File’s HANDLE is OK!

The return value is 1, error 0

Press any key to continue

 

方的有的是一个恐怕的出口结果。

 

This Module will try to follow the same steps:

Collecting the required and related information, presented in a Table and

Use the information to build a simple working program.

连下去我们会经过一样的办法及手续来演示如何建立一个得运行的次:

集必需的和连锁的音讯, 建立一个这些信的表,然后利用这些信息成功一个贯彻。

And another example of the required information in order to use CloseHandle() function.

一个有关CloseHandle的示范和连锁的音讯。

Information

信息

Description

描述/解释

The function

函数

CloseHandle().

The use

作用

Closes an open object handle.

关门一个靶的句柄

The prototype

函数原型

BOOL CloseHandle(HANDLE hObject);

Example

示范代码

hFile = CreateFile(fname,       // file to be opened

  GENERIC_WRITE,                // open for writing

  FILE_SHARE_WRITE,          // share for writing

  NULL,                                      // default security

  CREATE_ALWAYS,             // create new file only

  FILE_ATTRIBUTE_NORMAL |FILE_ATTRIBUTE_ARCHIVE |  SECURITY_IMPERSONATION,

   // normal file archive and impersonate client

   NULL);                     // no attribute template

 

CloseHandle(hFile);

The parameters

形参

hObject – [in, out] Handle to an open object.

 

hObject参数, 输入/输出参数, 指向一个开辟的目标的句柄。

The return value

返回值

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError().

 

假使函数执行成功,返回值是不零。

倘函数执行破产,那么以回到0. 如果需要得到更多的错误信息,可以调用GetLastError函数。

 

The header file

头文件

<windows.h>

 

Table 9:  CloseHandle() information.

The duplicate handle refers to the same object as the original handle.  Therefore, any changes to the object are reflected through both handles.

For example, the current file mark for a file handle is always the same for both handles.

复制对象句柄和原句柄一样好就此来拜访对象。因此,可以经复制对象句柄和原句柄来访问对象。例如the current file mark for a file handle is always the same for both handles.  //这句有硌没看明白。

 

 

Note that DuplicateHandle() should not be used to duplicate handles to I/O completion ports. In this case, no error is returned, but the duplicate handle cannot be used.

小心DuplicateHandle函数不能够就此来复制完整的I/O端口对象句柄。这种情形下,将无见面回去错误,但是复制对象句柄不可知动用。

 

In some cases, the new handle can have more access rights than the original handle.  However, in other cases, DuplicateHandle() cannot create a handle with more access rights than the original.

当某些情况下,复制对象句柄可能拥有比较原先句柄更强的拜会权限,而以另外有景下复制对象句柄可能持有较原来句柄更小之顾权限。 

 

For example, a file handle created with the GENERIC_READ access right cannot be duplicated so that it has both the GENERIC_READ and GENERIC_WRITE access right.

例如,一个装有GENERIC_READ访问控制权限的文本句柄不可知为复制,因此它以有GENERIC_READ和GENERIC_WRITE访问权限。

 

 

DuplicateHandle() can be called by either the source process or the target process (or a process that is both the source and target process).

DuplicateHandle函数能够吃原经过调用也能够叫目标经过调用(或者为一个既是本来经过,又是目标经过)。

 

For example, a process can use DuplicateHandle() to create a non-inheritable duplicate of an inheritable handle, or a handle with different access than the original handle.

比如说,一个经过可以下DuplicateHandle函数创建一个但承对象句柄的复制对象句柄,或者创造一个暨本句柄对象看权限不等同的进程。

 

The following Table lists the required information in order to use the DuplicateHandle() function.

下表描述了DuplicateHandle函数的必要信息以及怎么利用DuplicateHandle函数。

Information

Description

The function

DuplicateHandle().

The use

Duplicates an object handle.

复制一个靶句柄

The prototype

函数原型

BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions );

 

Example

HANDLE hStdinRd, hStdinWrDup;

BOOL fSuccess;

 

 fSuccess = DuplicateHandle(

GetCurrentProcess(),      // process’s handle to be duplicated

hStdinWr,                          // standard input handle

GetCurrentProcess(),      // process to receive the duplicated handle

&hStdinWrDup,                // pointer to variable for duplicated handle process receiver

0,                                        // access for the duplicated/new handle

FALSE,          

                   // not inherited

DUPLICATE_SAME_ACCESS);  // same access as the source handle

 

if(!fSuccess)

      printf(“DuplicateHandle() failed\n”);

 

The parameters

hSourceProcessHandle – [in] Handle to the process with the handle to duplicate. The handle must have the PROCESS_DUP_HANDLE access right.

hSourceProcessHandle – [in]: 待复制对象句所在进程的句柄。这个过程句柄必须持有PROCESS_DUP_HANDLE的看权限。

 

hSourceHandle – [in] Handle to duplicate.  This is an open object handle that is valid in the context of the source process.

hSourceHandle – [in], 需要复制的句柄,一个以来自进程中打开的有效的句柄。

 

hTargetProcessHandle – [in] Handle to the process that is to receive the duplicated handle. The handle must have the PROCESS_DUP_HANDLE  access right.

hTargetProcessHandle – [in]  用来储存目标复制句柄的历程对象句柄,这个进程句柄必须有所:PROCESS_DUP_HANDLE 访问权限。

 

lpTargetHandle – [out] Pointer to a variable that receives the duplicate handle. This handle value is valid in the context of the target process. If hSourceHandle is a pseudo handle returned by GetCurrentProcess() or GetCurrentThread(), DuplicateHandle() converts it to a real handle to a process or thread, respectively. If lpTargetHandle is NULL, the function duplicates the handle, but does not return the duplicate handle value to the caller. This behavior exists only for backward compatibility with previous versions of this function. You should not use this feature, as you will lose system resources until the target process terminates.

lpTargetHandle – [out],接收复制对象句柄的句柄指针,这个词柄值在复制句柄所于的进程遭到是可行之。 如果hSourceHandle句柄是一个由此GetCurrentProcess函数、GetCurrentThread函数返回的虚对象句柄,那么Duplicatehandle函数就将他转移为一个针对进程或线程的实对象句柄。 如果传递让复制对象句柄指针lpTargetHandle是一个NULL值,那么DuplicateHandle函数依然复制对象句柄,但是非见面拿对象句柄返回给调用他的函数空间内。这种气象就于为向后相当的情景线是;你切莫应有以这特性,否则你拿会少一些系统资源,直到目标经过终止。(注: 这里资源回收需要应用程序和系并保障)

 

dwDesiredAccess – [in] Access requested for the new handle.  For the flags that can be specified for each object type. This parameter is ignored if the dwOptions parameter specifies the DUPLICATE_SAME_ACCESS flag.  Otherwise, the flags that can be specified depend on the type of object whose handle is to be duplicated.

dwDesiredAccess – [in] :复制对象句柄的访权限限制,这个参数个旗标可以本着每个对象类型指定。 如果dwOptions参数设置成DUPLICATE_SAME_ACCESS, 那么这个参数的装将受忽略。 同时是参数的装置还同要源对象句柄的品类有关。

 

bInheritHandle – [in] Indicates whether the handle is inheritable.  If TRUE, the duplicate handle can be inherited by new processes created by the target process. If FALSE, the new handle cannot be inherited.

bInheritHandle – [in]: 这个参数设置复制对象句柄的后续特性,如果设置为TRUE,那么复制对象句柄的特色将好继续。 如果是FALSE,那么复制对象句柄的属性将非可以被接续。(注:就是说新创的复制对象句柄的习性不得以为其的分段对象所累)

 

dwOptions – [in] Optional actions. This parameter can be zero, or any combination of the following values.DUPLICATE_CLOSE_SOURCE – Closes the source handle.  This occurs regardless of any error status returned.DUPLICATE_SAME_ACCESS – Ignores the dwDesiredAccess parameter.  The duplicate handle has the same access as the source handle.

dwOptions – [in]: 可选取参数。 这个参数可以安装为0,或者是底下预定义宏的组合值(注: 位旗标的 或运算结果)

1、DUPLICATE_CLOSE_SOURCE 

   指示关闭源对象句柄,表示无论是是不是发生错误,都非回回值。

2、DUPLICATE_SAME_ACCESS

   指示忽略dwDesiredAccess参数的设定,而指定复制对象句柄也出自对象句柄具有相同的顾权限。

 

The return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.  To get extended error information, call GetLastError().

 

假使函数执行成功,返回值是无零。

倘函数执行破产,那么以返回0. 如果要得到更多的错误信息,可以调用GetLastError函数。

The header file

<windows.h>

 

消保护windows.h 头文件才能够引用该函数。

 

 

Table 10:  DuplicateHandle() information.

复制句柄函数的相干信息。

Handles returned by GetStdHandle() can be used by applications that need to read from or write to the console.

GetStdHandle函数可以于急需读写控制台的时候回来控制高句柄。

 

When a console is created, the standard input handle is a handle to the console’s input buffer, and the standard output and standard error handles are handles of the console’s active screen buffer.

当控制台被创造后,标准输入设备句柄是一个针对标准输入缓存区的句柄,标准输出设备句柄和正规错误输出设备句柄是一个针对性控制高窗口缓冲区的句柄。

 

These handles can be used by the ReadFile() and WriteFile() functions, or by any of the console functions that access the console input buffer or a screen buffer, for example, theReadConsoleInput(), WriteConsole(), or GetConsoleScreenBufferInfo() functions.

这些词柄可以被ReadFile函数和WriteFile函数使用,或者叫其他可以访问控制台输入缓存区和控制高窗口缓存区的函数使用, 例如可以被ReadConsoleInput函数、WriteConsole函数、以及GetConsoleScreenBufferInfo函数使用。

 

The standard handles of a process may be redirected by a call to SetStdHandle(), in which case GetStdHandle() returns the redirected handle.

If the standard handles have been redirected, you can specify the CONIN$ value in a call to the CreateFile() function to get a handle to a console’s input buffer.  Similarly, you can specify the CONOUT$ value to get a handle to a console’s active screen buffer.

一个过程的正儿八经句柄也许会透过调用SetStdHandle句柄来拓展重复定向, 这种景象下可以经过GetStdHandle函数返回重定向后底指针。如果标准句柄被重定向后,你可以在调用CreateFile函数时传递CONIN$变量来得到控制高输入缓冲区的句柄。 类似的,你得指定CONOUT$值来获取一个针对活动之支配高窗口缓冲区的句柄。

 

The following Table lists the required information in order to use the GetStdHandle() function.

下表描述有GetStdHandle函数的必要信息,以及如何用她的局部音讯。

 

Information

Description

描述/解释

The function

GetStdHandle().

The use

Retrieves a handle for the standard input, standard output, or standard error device.

返回标准输入输出设备的句柄。

The prototype

 

HANDLE GetStdHandle(DWORD nStdHandle);

函数的原型

Example

示例

HANDLE hStdout;

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

The parameters

nStdHandle – [in] Standard device for which a handle is to be returned. This parameter can be one of the following values:

STD_INPUT_HANDLE – Handle to the standard input device. Initially, this is a handle to the console input buffer, CONIN$.

STD_OUTPUT_HANDLE – Handle to the standard output device. Initially, this is a handle to the active console screen buffer, CONOUT$.

STD_ERROR_HANDLE – Handle to the standard error device. Initially, this is a handle to the active console screen buffer,CONOUT$.

 

nStdHandle – [in]:指出将返回那个标准配备的语句柄值,这个参数可以落下几乎只宏中的一个:

1、STD_INPUT_HANDLE 

  指出返回标准输入设备的句柄, 通常这词柄是一个对控制高输入缓冲区CONIN$ 的句柄。

2、STD_OUTPUT_HANDLE

  指出返回的是正经输出设备的句柄,通常这个词柄是一个针对性当前激活控制高窗口缓冲区 CONOUT$的句柄。

3、STD_ERROR_HANDLE

  指出函数返回的是正规错误输出设备的句柄, 通常这词柄是一个对当前激活的支配高窗口缓冲区CONOUT$的句柄。

 

The return value

If the function succeeds, the return value is a handle to the specified device, or a redirected handle set by a previous call toSetStdHandle().  The handle has GENERIC_READ and GENERIC_WRITE access rights, unless the application has usedSetStdHandle() to set a standard handle with lesser access.

If the function fails, the return value is INVALID_HANDLE_VALUE.  To get extended error information, call GetLastError().

If an application does not have associated standard handles, such as a service running on an interactive desktop, and has not redirected them, the return value is NULL.

 

   如果此函数成功实行,那么回回值就是一个针对指定设备的句柄,或者是一个对准通过SetStdHandle函数重定向的装备的词柄值。

   返回的语句柄具有  GENERIC_READ 和 GENERIC_WRITE的造访权限, 除非应用程序通过SetStdHandle函数设定标准句柄具有任何更低的权位。

  如果函数执行破产,返回值是 INVALID_HANDLE_VALUE, 若要获得更多之错误信息,可以调用GetLastError函数。

  如果一个应用程序没有正经配备句柄,或者尚未重定向专业配备,例如一个中间桌面运行的一个劳动,那么函数将回一个NULL值。

 

The header file

<windows.h>

待包含windows.h头文件。

 

Table 11:  GetStdHandle() information.

The standard handles of a process may have been redirected by a call to SetStdHandle(), in which case GetStdHandle() will return the redirected handle.

If the standard handles have been redirected, you can specify the CONIN$ value in a call to the CreateFile() function to get a handle to a console’s input buffer.

一个历程的科班输入输出设备可能会见由此调用SetStdHandle函数进行再次定向,这种状况下好经过GetStdHandle函数来得到进程经过重定向后底标号输入输出设备的句柄。 如果标准输入输出设备被重定向了,那么以应用程序中调用CreateFile函数时可以经点名CONIN$参数来取一个对控制高输入缓冲区的句柄。

 

Similarly, you can specify the CONOUT$ value to get a handle to the console’s active screen buffer.

看似之尚足以指定CONNOUT$值来获得指向当前激活的控制高窗口缓冲区的句柄。

 

The following Table lists the required information in order to use the SetStdHandle() function.

Information

Description

The function

SetStdHandle().

重定向专业输入输出设备

The use

Sets the handle for the standard input, standard output, or standard error device.

设定标准输入设备、标准输出设备、标准错误设备的句柄。

The prototype

BOOL SetStdHandle(DWORD nStdHandle, HANDLE hHandle);

函数原型

 

Example

HANDLE hStdout;

BOOL success = SetStdHandle(STD_OUTPUT_HANDLE, hStdout);

// if something wrong with handle

if(!success)

// just exit

exit(1);

 

示范代码

The parameters

nStdHandle – [in] Standard device for which the handle to be set.  This parameter can be one of the following values:

STD_INPUT_HANDLE – Handle to the standard input device.

STD_OUTPUT_HANDLE – Handle to the standard output device.

STD_ERROR_HANDLE – Handle to the standard error device.

 

nStdHandle – [in]:指出如受再次设定的正规化配备。可以赢得下几乎只价:

1、STD_INPUT_HANDLE

   指出如设定的是正规输入设备。

2、STD_OUTPUT_HANDLE

   指出要设定的配备是正统输出设备 

3、STD_ERROR_HANDLE 

    指出要设定的凡标准错误输出设备

 

hHandle – [in] Handle to set to the specified device.

 

hHandle – [in] 要重定向吃专业配备的靶子的句柄。

 

The return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.  To get extended error information, call GetLastError().

 

如果函数执行成功,返回值是未零。

设若函数执行破产,那么用赶回0. 如果急需得到更多的错误信息,可以调用GetLastError函数。

The header file

<windows.h>

假定含有头文件 window.h 

 

Table 12:  SetStdHandle() information.

SetStdHandle函数相关信息

The following program example uses GetStdHandle() function for standard input and output handles.

下面是一个施用GetStdHandle函数来博取标准输入输出设备句柄的示范。

 

#include <windows.h>

#include <stdio.h>

#define BUFSIZE 2048

 

int main()

{

   char chrBuf[BUFSIZE];

   DWORD dwRead, dwWritten;

   HANDLE hStdin, hStdout;

   BOOL fSuccess;

 

   // standard output handle

   hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

   // standard input handle

   hStdin = GetStdHandle(STD_INPUT_HANDLE);

   // if something wrong with handle for standard input or output

   if((hStdout == INVALID_HANDLE_VALUE) || (hStdin == INVALID_HANDLE_VALUE))

   // just exit

   exit(1);

   printf(“Waiting data from standard input:\n”);

   printf(“–EOF to end–\n”);

   // to stop, press end of file characters

   for(;;)

   {

       // read from standard input, keyboard.

       fSuccess = ReadFile(hStdin, chrBuf, BUFSIZE, &dwRead, NULL);

       if(!fSuccess || dwRead == 0)

          break;

             printf(“Data to the standard output:\n”);

       // write to standard output, console.

       fSuccess = WriteFile(hStdout, chrBuf, dwRead, &dwWritten, NULL);

       if(!fSuccess)

          break;

   }

   return 0;

}

 

A sample output:

 

Waiting data from standard input:

–EOF to end–

This line of text is from standard input

Data to the standard output:

This line of text is from standard input

Then redirected to standard output…

Data to the standard output:

Then redirected to standard output…

^Z

Press any key to continue

 

The following is a sample output run using VC++ Express Edition on Win XP Pro SP2 with Windows SDK.

 

 

 

相关文章