Windows工作原理的中心思想就是“动态链接”概念。Windows本身有很多定义在动态链接库里卖弄的函数,他们存在于system或system32子目录下。
早期的Windows大部分只是实现了三个动态链接库,分别是内核,用户,GDI。分别对应于kernel32 user GDI三个动态链接库。
其中内核实现的是内存管理 文件输入输出 任务管理等
用户 则是窗口管理 界面
GDI 图形设备接口等
c语言的库函数最终链接时会放在程序代码中,而Windows动态链接库时放在程序之外的dll文件中。
Windows程序运行的时候,通过一个叫动态链接的进程与Windows连接。其中每个Windows的可执行文件包含他所用的动态链接库中的函数的引用地址。当程序被分配内存并装入的时候,这些引用地址直接解析成指向dll函数入口的指针。同时被调用的函数也会被装入内存。
链接Windows程序生成可执行文件时候,一个叫 导入库 的表非常重要,里面存在着需要导入库的名称以及引用信息。
下面引入第一个win32 api程序。
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox (NULL, TEXT ("我是青青草原小绵羊"), TEXT ("逆向小绵羊"), 0) ;
return 0 ;
}
winapi 这个是个宏定义,是_stdcall 函数调用约定规则 是由被调函数实现栈平衡。
windows程序主函数是winmain 其中第一个参数是句柄,这个值标识着这个程序,第二个参数可以用来查看是否有其他实例还在运行,但是现在很少用了,一般为null。第三个参数是运行命令字串 第四个是窗口最初显示方式,正常 最大化 最小化 全屏。
其次来谈一下 预编译的事情
我也是疑惑在为什么要添加这个头文件,我查了查就明白了其中的原因,为了提高编译速度。
如果说每个源文件都要添加重复的头文件的话,那么会重复引入头文件,这个时候会导致编译变慢。这点我是清楚的,但是看到解释中的mfc时,我就想为什么我直接用win32 api编程还需要呢,原来是我的编译器的设定问题,可以通过项目-》项目属性-》预编译头来选择预编译头文件或者直接取消。