推荐阅读《深入浅出:Windows Api 程序设计》。《深入浅出:Windows Api 程序设计》是 王端明 先生的著作,是2022年人民邮电出版社出版的图书。
基础知识
一、Windows 特色
Microsoft Windows是美国微软公司开发的一套操作系统。自1985年问世以来,随着软硬件的升级,Microsoft Windows不断迭代更新,变得更加人性化,始终备受市场青睐。
Windows操作系统主要特点是图形用户界面、多任务、一致的用户界面等。
而对程序员开发者来说,Windows操作系统有以下卓越的优点:
- 大量API函数调用:支持几千种函数调用 ,可开发出界面精美、性能卓越的应用程序。
- 设备无关性:应用程序只需要针对设备的驱动程序进行开发,而不必关注设备的具体型号。
- 内存管理方便:内存分页和虚拟内存的使用,使得应用程序可用的地址空间极大。
Windows Api(应用程序编程接口,Application Programming Interface,简称API),允许开发者调用操作系统提供的一系列功能,而不必考虑其底层的运行机制。Api函数是构建整个Windows框架的基石,它的上层是所有Windows应用程序。
二、编程语言
- 机器语言:机器指令(二进制0和1描述的指令)的集合。直接对硬件操作。开发者使用困难,依赖机器,局限性很大,属于低级语言。
- 汇编语言:汇编指令(英文缩写的助记符描述的指令)的集合。直接对硬件操作。比较复杂、冗长;但是其生成的可执行文件(.exe或.dll)较小,且执行速度快。
- 高级语言:“高级”是相对于汇编而言的,包含很多种编程语言。对开发者而言,易操作,学习使用简单。
- 不可直接被机器识别,需要转换才可被执行。按转换方式分类:
- 解释类:一边翻译成机器语言,一边被执行。效率较低,不能生成独立的可执行文件。但较为灵活,可动态调整修改应用程序代码。如python,JavaScript等。
- 编译类:程序执行前,翻译成机器语言。可脱离编程环境独立执行,效率较高。但修改后需重新编译,才可生成目标文件。如C、C++等。
- 不可直接被机器识别,需要转换才可被执行。按转换方式分类:
三、安装软件
按部就班安装VS就行。
四、Hello World 程序练习
1、创建工程
使用Visual Studio 2022开发实现。文章来源:https://www.toymoban.com/news/detail-716141.html
- 左上角
文件
-新建
-项目
。 - 筛选语言为
C++
,平台为Windows
,项目类型为桌面
,选择Windows桌面向导
,下一步。
Windows桌面向导
- 对项目命名,选定项目路径,创建。
- 在应用程序类型中选择
桌面应用程序(.exe)
,勾选空项目,确定。
应用程序类型
- 默认情况下,设置为
Debug x86
(32位程序,调试版本) - 在解决方案资源管理器窗口中,选中创建的项目,右击,
添加
-新建项
,选择C++文件(.cpp)
,改名,添加。
添加C++文件
2、编写程序
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, TEXT("Hello World!"), TEXT("Caption"), MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2);
return 0;
}
2.1 Windows.h
- 重要头文件,包含:
- WinDef.h:基本数据类型定义
- WinBase.h:Kernel(内核)有关定义
- WinGdi.h:图形设备接口有关定义
- WinUser.h:用户界面有关定义
2.2 入口函数 WinMain
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
);
-
函数调用约定:用于描述 函数参数怎么传递 和 由谁来平衡堆栈。常用的函数调用约定有
_stdcall
,_cdecl
,_fastcall
,pascal
等。- 其中,
WinMain
中的WINAPI
的定义就是函数调用约定。<minwindef.h>
中:#define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall
- 其中,
-
批注:函数中每个参数的数据类型前的参数说明符,用于说明函数参数的性质与类型。
-
_In_
:输入参数,函数只可读取但不可修改该参数 -
_Inout_
:输入输出参数,调用前可设置数值,函数返回后会修改该参数的值 -
_Out_
:输出参数,函数返回后,会返回一个值给这个参数 -
_Outptr_
:输出参数,函数返回后,会返回一个指针值给这个参数 - 带有
opt
:表示可以不使用该参数,也可设置为0,NULL
-
-
WinMain
的四个参数:-
HINSTANCE hInstance
:表示应用程序当前实例的句柄。句柄是用于唯一标识某个对象的数值。- 模块:代表的是一个运行中的.exe或.dll 文件。文件中的所有代码和资源载入内存后运行时叫作模块;为了区分地址空间中的不同模块,每个模块都有一个唯一的模块句柄来标识。
- 实例:多次加载同一个可执行文件时,为了区分多次加载的“复制”,把每个“复制”叫作实例。每个实例均用不同的实例句柄(HINSTANCE)值来标识。在 Win32 中,实例句柄就是模块句柄。
-
HINSTANCE hPrevInstance
:表示应用程序上一个实例的句柄。同一程序的所有实例共享代码和只读数据。查看该参数,可以查看是否有其他实例在运行,从而进行数据共享。对于 Win32,该参数始终为NULL。 -
LPSTR lpCmdLine
:指向应用程序命令行参数字符串的指针。LPSTR
是一种windows数据类型,表示一个以零(NULL)结尾的char类型字符串的指针。 -
int nCmdShow
:指定应用程序最初如何显示。
-
2.3 MessageBox 函数
int MessageBox(
_In_opt HWND hWnd, //消息框的所有者的窗口句柄
_In_opt LPCTSTR lpText, //要显示的消息内容
_In_opt LPCTSTR lpCaption, //消息框的标题
_In_ UINT uType //消息框的图表样式和按钮样式
);
- 功能是显示一个消息提示框,可以包含:系统图标、按钮、消息标题、消息内容。
-
HWND hWnd
:消息框的所有者的窗口句柄。句柄类型:HWND
——窗口句柄类型;HIC0N
——图标句柄类型;HCURSOR
——光标句柄;HBRUSH
——画刷句柄。 -
LPCTSTR lpText
:要显示的消息内容。LPCTSTR
表示指向 wchar_t 或 char 类型常量字符串的指针。 -
LPCTSTR lpCaption
:消息框的标题 -
UINT uType
:消息框的图表样式和按钮样式 - 各个参数的具体数值可以参看官方目录——MessageBox 函数 (winuser.h)
五、程序编译
将一个C/C++文件编译成可执行程序,需要经过预处理、汇编、编译、链接等阶段。(利用linux环境下的gcc编译工具可以清晰看到编译的阶段)文章来源地址https://www.toymoban.com/news/detail-716141.html
1、预处理
-
.c
文件转成.i
文件 - 预处理过程中的工作:宏定义展开;处理所有条件编译指令;处理
#include
;删除注释;添加行号和文件标识。
2、汇编
-
.i
文件转为.s
文件 - 汇编的过程检查语法错误
3、编译
-
.s
文件转成.obj
文件 - 汇编文件转成目标文件(二进制文件)
4、链接
-
.obj
文件转成.exe
文件 - 在此过程中,将二进制的目标文件与用到的库绑定链接在一起
六、例程运行效果
运行结果
到了这里,关于Windows Api 学习笔记 1——基础知识(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!