Windows运作机制的核心是动态链接,系统的动态链接库主要位于\WINDOWS\SYSTEM32中,以后缀.dll形式保存。
其中Kernel、User和GDI为三个最主要的动态链接库,大多数典型的windows函数会对应到这三个模组中。
Kernel: 内存管理、文件I/O、多任务管理。
User: 使用者接口、窗口运作机制。
GDI: 图形设备接口、允许程序在输出设备上显示文字和图形。
当执行Windows程序时,它通过一个称作「动态链接」的过程与Windows相接。一个Windows的.EXE文件中有使用到的不同动态链接库的参考数据,所使用的函数即在那些动态链接库中。当Windows程序被加载到内存中时,程序中的呼叫被指向DLL 函数的入口。如果该DLL不在内存中,就把它加载到内存中。
当连结Windows程序以产生一个可执行文件时,必须连结程序开发环境提供的特定「引用链接库(import library)」。这些引用链接库包含了动态链接库名称和所有Windows函数呼叫的引用信息。连结程序使用该信息在.EXE文件 中建立一个表格,在加载程序时,Windows使用它将呼叫转换为Windows函数。
另外,MFC 对WIN API 进行了封装,隐藏了许多复杂的情节。
#include
int main ()
{
printf ("hello, world\n") ;
return 0 ;
}
如上普通C语言程序(命令行)包含一个include声明,main函数(程序的进入点),一个对执行期链接库函数的呼叫(printf)和一个return语句。
而windows程序则有所不同:
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, WinAPI"), TEXT("HelloMsg"), 0);
return 0;
}
Windows程序的进入点为WinMain,C语言执行的链接库函数printf被Windows API函数MessageBox所代替。
windows.h中包含的头文件中,较为重要的有:
- WINDEF.H 基本型态定义
- WINNT.H 支持Unicode的型态定义
- WINBASE.H Kernel函数
- WINUSER.H User接口函数
- WINGDI.H GDI接口函数
Win程序进入点WinMain的声明在WINBASE.H中,声明的形式为:
int WINAPI WinMain (
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd
);
此外,windows程序中变量名普遍使用[匈牙利表示法]的命名系统,即在变量名称前加上小写的数据类型名称的缩写。如i表示int,sz表示以0结束的字符串。
WINAPI在WINDEF.H中定义:
#define WINAPI __stdcall
该语句指定了一个呼叫约定,包括如何生产机械码以在堆栈中放置函数呼叫的参数。许多Windows函数呼叫声明为WINAPI。
//对于刚刚的函数WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
第一个参数hInstance被称为执行体句柄,该句柄唯一地表示该程序,可以被其他函数用作参数。第二个参数hPrevInstance总是NULL(定义为0)。第三个参数用于执行程序的命令列,某些Windows应用程序利用它在程序启动时将文件加载内存。第四个参数指出程序最初显示的方式(大小,最小化等)。
MessageBox(NULL, TEXT("Aloha."), TEXT("Aloha!"), 0);
MessageBox函数用于显示短信息。第一个参数是窗口句柄,这里暂时为NULL。第二个参数是弹窗主体所显示的信息。第三个参数可以理解为弹窗的title。TEXT为一个封装字符串的宏。第四个参数用于指出希望显示在对话框中的按钮(具体定义在WINUSER.H中以MB_开始的常数)。对于第4个参数,可以通过'|'运算符来进行组合,包括按钮显示信息,对话框外观等。
MessageBox(NULL, TEXT("haha!"), TEXT("hehe"), MB_OK|MB_ICONWARNING);
根据msgbox显示的情况不同,其返回值(返回值定义在WINUSER.H中)的类型也不同,返回的类型有IDYES、IDNO、IDCANCEL、IDABORT等。
The unexamined life is not worth living. So chase the dream and go further!