1、基础
Windows 运作机制的核心是动态链接的概念,Windows提供应用程序丰富的可呼叫函数,这些函数采用Dynamic Linking Library(DLL)的方式撰写,是具有.dll或.exe为扩展名的文件。
早期的Windows主要部分仅通过三个动态链接库实现,分别为Kernel、User和GDI,大多数windows程序产生的函数呼叫仍可对应到这三个模块。Kernel处理传统上认为操作系统的核心任务,包括内存管理、文件I/O和多任务管理;User指使用者接口,实现所有窗口的运作机制;GDI(Graphics Device Interface)指图像设备接口,允许程序在屏幕和打印机上显示文字和图形。
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,API函数包含在位于系统目录下的DLL文件中。
2、表头文件
WINDOWS.H是主要的包含文件,最基本的是:
WINDEF.H 基本型态定义
WINNT.H 支持Unicode的型态定义
WINBASE.H kernel函数
WINUSER.H 使用者接口函数
WINGDI.H 图形设备接口函数
3、程序进入点
Windows 程序的进入点是WinMain,定义为:
Int WINAPI WinMain(HINSTABCE hInstance,HINSTABCE hPreInstance, PSTR szCmdLine , int iCmdshow)
其中,前缀i 表示int、sz表示「以零结束的字符串」,WinMain返回一个int值,WINAPI标识符在WINDEF.H中定义,内容如下:
#define WINAPI _stdcall
该语句指定了一个呼叫约定,包括如何生产机械码以在堆栈中放置函数呼叫的参数。此外,cdecl调用约定的参数压栈顺序是和stdcall是一样的,参数首先由有向左压入堆栈。所不同的是,函数本身不清理堆栈,调用者负责清理堆栈。
HINSTABCE 表示应用程序的句柄,hWnd,是指窗口句柄,通过该句柄可以操作窗口资源。
4、Unicode字符集
Unicode是统一的16位系统,可以表示65,536个字符,在Unicode中,没有单单使用8位数值的意义存在。而在双字节字符集中可处理8位数值,而某些字节则需要和另一个字节共同定义一个字符。
C中的宽字符基于wchar_t数据型态,在表头文件WCHAR.H中定义如下:
Typedef unsigned short wchar_t;
1)定义指向宽字符串的指针: wchar_t *p=L”Hello!”;
其中,第一个引号前面的大写字母L(代表「long」)。将告诉编译器该字符串按宽字符保存-即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字符串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。
2)也可以定义:wchar_t c = L'A' ;
在此情况中,通常L是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。
TCHAR.H定义了一个新的数据型态TCHAR
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
_T()会根据编译条件的设置,选择不同的编码格式。
_T("")是一个宏,定义于tchar.h下。
#define _T(x) _ _T(x)
#ifdef _UNICODE
#define _ _T(x) L ## x (分析: ##把两个符号连起来,用来连接两个前后两个参数,把它们变成一个字符串,在x前添加字符L)
#else
#define _ _T(x) x
#endif
其他相关定义:
LPSTR 指向CHAR型字符串的指针char* ANSI
LPCSTR 指向CHAR型字符串常量的指针const char* ANSI
LPWSTR 指向WCHAR型字符串的指针wchar_t* UNICODE
LPCWSTR 指向WCHAR型字符串常量的指针const wchat_t* UNICODE
LPTSTR UNICODE 环境下==LPWSTR,非UNICODE环境下==LPSTR
LPCTSTR UNICODE 环境下==LPCWSTR,非UNICODE环境下==LPCSTR
相关宏定义
#ifdef UNICODE
typedef LPWSTR LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#else
typedef LPSTR LPTSTR ;
typedef LPCSTR LPCTSTR ;
#endif
类型名称定义说明
L: 即long为与之前16位系统兼容,32位系统中无意义
P: 即指针
C: 即const
STR: 即字符串