Windows Api 学习笔记 1——基础知识(上)

这篇具有很好参考价值的文章主要介绍了Windows Api 学习笔记 1——基础知识(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

推荐阅读《深入浅出: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开发实现。

  • 左上角文件-新建-项目
  • 筛选语言为C++,平台为Windows,项目类型为桌面,选择Windows桌面向导,下一步。
winapi,# Windows API和MFC,windows,c++,microsoft
Windows桌面向导

  • 对项目命名,选定项目路径,创建。
  • 在应用程序类型中选择桌面应用程序(.exe),勾选空项目,确定。
winapi,# Windows API和MFC,windows,c++,microsoft
应用程序类型

  • 默认情况下,设置为Debug x86(32位程序,调试版本)
  • 在解决方案资源管理器窗口中,选中创建的项目,右击,添加-新建项,选择C++文件(.cpp),改名,添加。
winapi,# Windows API和MFC,windows,c++,microsoft
添加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_fastcallpascal等。
    • 其中,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文件
  • 在此过程中,将二进制的目标文件与用到的库绑定链接在一起

六、例程运行效果

winapi,# Windows API和MFC,windows,c++,microsoft
运行结果

到了这里,关于Windows Api 学习笔记 1——基础知识(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Zookeeper学习笔记(1)—— 基础知识

    Zookeeper 是一个开源的分布式的, 为分布式框架提供协调服务 的 Apache 项目 Zookeeper从设计模式角度来理解:是一个基于 观察者模式 设计的 分布式服务管理框架 ,它 负责存储和管理大家都关心的数据 ,然后 接受观察者的注 册 ,一旦这些数据的状态发生变化,Zookeeper就 将负

    2024年02月05日
    浏览(38)
  • golang学习笔记(defer基础知识)

    defer语句用于golang程序中延迟函数的调用, 每次defer都会把一个函数压入栈中, 函数返回前再把延迟的函数取出并执行。 为了方便描述, 我们把创建defer的函数称为主函数, defer语句后面的函数称为延迟函数。延迟函数可能有输入参数, 这些参数可能来源于定义defer的函数,

    2024年04月25日
    浏览(48)
  • Android ContentProvider基础知识学习笔记

    1、动态申请权限 2、读取手机联系人 3、创建自己的ContentProvider (1) onCreate()。初始化ContentProvider的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回true表示ContentProvider初始化成功,返回false则表示失败。 (2) query()。从ContentProvider中查询数据。uri参数用于确定查

    2024年04月10日
    浏览(45)
  • (学习笔记-IP)IP基础知识

    IP在TCP/IP参考模型中处于第三层,也就是 网络层。 网络层的主要作用是: 实现主机与主机之间的通信,也叫点对点的通信。  网络层与数据链路层的关系: MAC的作用是实现 直连 的两个设备之间通信,而IP负责 没有直连 的两个网络之间进行通信传输  因此 计算机网络中需要

    2024年02月16日
    浏览(52)
  • 数电模电基础知识学习笔记汇总

    文章目录: 数电和模电的关系 一:模电学习笔记 二:数电学习笔记 三:福利 1.NI Multisim14.0电路仿真软件的下载安装 2.进制转换 3.电路常用公式 4.好的参考笔记  4.1 笔记  3.1.1 模电 3.1.1 数电 4.2 网站 5.八股文 来源:一周搞(不)定数电模电全集,电子基础知识 11小时 模电基

    2024年02月15日
    浏览(60)
  • CAN总线学习笔记 | CAN基础知识介绍

    1.1 CAN协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下: 1.2 CAN物理层 CAN 通讯不是以时钟信号来进行同步的,它

    2023年04月09日
    浏览(48)
  • UE4 地形编辑基础知识 学习笔记

    之前自己写过这样的功能,今天看到一个UE现成的 点击地形,选择样条 按住CTRL键+点击屏幕中某一个点会在场景内生成一个这样的图标 再点两次,会生成B样条的绿线条 点击+号再选择一个模型,会生成对应的链条状的mesh 拉高最远处的一个图标抬高 如果想地形贴合该mesh,则

    2024年02月11日
    浏览(56)
  • PyTorch学习笔记(二):PyTorch简介与基础知识

      👨‍💻 作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享, 公众号: GoAI的学习小屋,免费分享书籍、简历、导图等资料,更有交流群分享AI和大数据,加群方式公众号回复“加群”或➡️点击链接。 🎉 专栏

    2023年04月09日
    浏览(47)
  • 嵌入式学习笔记——STM32硬件基础知识

    上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题,还没有到实际的开发板上,我们的单片机是都是焊接在开发板上的,PCB上有着它所需的工作电路。并不是直接给供电电压就可以让其工作的,本文主要是简介一下

    2024年01月22日
    浏览(75)
  • web渗透安全学习笔记:2、HTML基础知识

    目录 前言 HTML的标题 段落链接与插入图片 HTML元素 HTML属性 HTML头部 HTML与CSS HTML与JavaScript 表格与列表 HTML区块 布局 HTML表单 HTML与数据库 音频与视频 HTML事件 运行效果:   ———————————————————————————————————————————  ——

    2024年01月21日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包