Windows API编程01-详解第一个程序(超级详细)

这篇具有很好参考价值的文章主要介绍了Windows API编程01-详解第一个程序(超级详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

联系WeChat:i-xiaodi,交流,付费课程学习

简单介绍Windows API:

Windows API(Application Programming Interface)是Microsoft Windows平台的应用程序编程接口,其主要目的是让应用程序开发人员可以调用操作系统提供的一组例程功能,而无须考虑其底层的源代码实现及内部工作机制。API函数是构筑整个Windows框架的基石,它基于Windows的操作系统核心,上层是所有的Windows应用程序。

简单来说,这些API接口就是函数,就像C语言调用的stdio.h中的函数一样。只不过这些函数是微软提供给我们的,也放在了对应的头文件.h中,用到的时候包含相应的头文件即可。

创建一个使用Windows API的程序:

winapi,Windows API编程基础,windows

 winapi,Windows API编程基础,windows

 winapi,Windows API编程基础,windows

添加源文件,然后编译代码,生成程序

代码如下:

#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;
}

弹出一个消息框,标题为Caption,内容为Hello World!

winapi,Windows API编程基础,windows

 解释:

1.Windows.h

头文件,包含我们所用的一些函数的声明,比如WinMain(入口函数)、MessageBox(信息框)

2.WinMain函数

入口函数,类似于C语言的main函数,这个是Windows应用程序的入口函数

winapi,Windows API编程基础,windows

3.WINAPI

这个是函数的调用约定,只不过用宏进行了重新定义 

winapi,Windows API编程基础,windows

拓展:

CALLBACK、WINAPI、APIENTRY等都代表__stdcall,__stdcall是一种函数调用约定,也称为标准调用约定。函数调用约定描述函数参数的传递方式和由谁来平衡堆栈,在程序中调用一个函数时,函数参数的传递是通过堆栈进行的,也就是说调用者把要传递给函数的参数压入堆栈,函数在执行过程中从堆栈中取出相应的参数使用。 

4.批注

程序生成成功后,会出现绿色波浪线,提示批注不一致

winapi,Windows API编程基础,windows

 我们转到WinMain函数的声明

winapi,Windows API编程基础,windows

我们可以看到微软WinMain函数声明的每个参数的数据类型前都有一个参数说明符:_In_、_In_opt_等,这些参数说明符称为参数批注。

我们只需要把微软正规的代码抄过来,就可以了。

winapi,Windows API编程基础,windows

 关于批注:

参数批注用于说明函数参数的性质和类型,可以帮助开发人员更好地了解如何使用这些参数。

winapi,Windows API编程基础,windows

与上面4个参数批注对应的还有_In_opt_、_Inout_opt_、_Out_opt_和_Outptr_opt_,opt表示可选择(optional),表示可以不使用该参数,也可以设置为0或者NULL(0),而表格中的4个不带opt的参数批注表示该参数必须指定一个合理的值,也就是说,你必须得填。

在VS 2019以前,并不要求在函数声明和定义中设置参数批注,参数批注仅用于指导程序员正确使用函数参数。为了正规一些,我们列出参数批注更好一些,以帮助大家正确使用函数参数。

5.WinMain函数参数解释

、_In_ HINSTANCE hInstance:

h是handle的首字母,表示当前应用程序的实例句柄,在Windows程序中句柄无非就是一个数值,程序中用它来标识某些对象,本次代码中hInstance实例句柄就唯一地标识了正在运行中的exe程序文件。

内存中的样子(随机基址)

winapi,Windows API编程基础,windows

固定基址(0x00400000) 

winapi,Windows API编程基础,windows

 拓展:

模块:

模块代表的是一个运行中的.exe或.dll文件,表示这个文件中的所有代码和资源。磁盘上的文件不是模块,载入内存后运行时叫作模块。另外,一个应用程序调用其他动态链接库中的API时,这些.dll文件也会被载入内存,这就产生了一些动态链接库模块。

因为有这么多的模块,所以,为了区分地址空间中的不同模块,每个模块都有一个唯一的模块句柄来标识。模块句柄实际上就是一个内存基地址,系统将.exe或.dll文件加载到地址空间的这个位置

实例:

实例的概念源于Win16,Win16系统中运行的不同程序的地址空间并非是完全隔离的。一个可执行文件运行后形成模块,多次加载同一个可执行文件时,这个模块是公用的。为了区分多次加载的“复制”,把每个“复制”叫作实例,每个实例均用不同的实例句柄(HINSTANCE)值来标识。

但在Win32中,每一个运行中的程序的地址空间是隔离的,每个实例都使用自己私有的4GB虚拟地址空间,不存在一个模块具有多个实例的问题。即使同一程序同时运行了多个,它们之间通常也是互不影响的。在Win32中,实例句柄就是模块句柄,但很多API函数中用到模块句柄的时候使用的名称还是实例句柄。

随着历史的发展与进步,很多词语已经不是他本来的含义,不过我们也能理解,这正是一种文化的延续。

二、_In_opt_ HINSTANCE hPrevInstance

表示应用程序上一个实例的句柄。在Win16中,当同时运行一个程序的多个副本时,同一程序的所有实例共享代码以及只读数据(例如菜单或对话框模板之类的资源),一个程序可以通过査看hPrevInstance参数从而得知是否有它的其他实例在运行,这样就可以把一些数据从前一个实例移到自己的数据区来。

对于Win32应用程序,该参数始终为NULL。这个是历史残留。

三、_In_ LPSTR lpCmdLine

指向应用程序命令行参数字符串的指针,不包括可执行文件名。要获取整个命令行,可以调用GetCommandLine函数。例如,在D盘下有一个111.txt文件,当我们用鼠标双击这个文件时将启动记事本程序(notepad.exe),此时系统会将D:\111.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序得到这个文件的路径后,在窗口中显示该文件的具体内容。

拓展:

关于LPSTR,LPSTR是一种Windows数据类型

winapi,Windows API编程基础,windows

 _Null_terminated_表示以零结尾的字符串,LPSTR表示一个以零结尾的char类型字符串的指针。LPSTR中的LP是Long Pointer(长指针),这是Win16遗留的概念。在Win32中不区分长短指针,指针都是32位。以零结尾,有时候也称为以空字符结尾、以NULL结尾等。

四、_In_ int nShowCmd

指定应用程序最初如何显示,例如在任务栏上正常显示、最大化到全屏显示或最小化显示。文章来源地址https://www.toymoban.com/news/detail-810827.html

到了这里,关于Windows API编程01-详解第一个程序(超级详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【超级详细】熟悉Kafka的基本使用方法的实验【Windows】

    Kafka 是由 Apache 软件基金会开发的一个开源消息队列平台,它是一种高性能、可扩展、分布式的发布-订阅消息系统。Kafka 的架构被设计为高效、低延迟,并具有高吞吐量、持久性和可靠性。 在 Kafka 中,生产者将消息发布到主题(topic)中,消费者则从主题中消费消息,使用者可

    2024年02月07日
    浏览(41)
  • 最新保姆级教程:Windows 上安装 Visual Studio(超级详细)

    欢迎来到我的分享!今天我将向大家介绍如何在 Windows 系统上安装 Visual Studio,这是一款强大的集成开发环境(IDE),用于 C/C++ 开发以及其他许多语言。 1、首先,访问 Visual Studio 官方网站,在主页上找到并点击“下载 Visual Studio”按钮。供个人学习,下载免费的 在下载页面

    2024年03月21日
    浏览(61)
  • 【Windows系统编程】01.文件与目录操作-笔记

    本专栏从这篇文章开始做Windows系统编程的笔记,本章主要讲解:Windows文件操作(读写文件,删除文件,拷贝文件,移动文件等),目录操作(遍历目录,删除目录等)硬盘的一点小知识。 参考书:Windows核心编程 上述的是没有错误的操作流程 如果文件已经存在的话,就会出

    2024年02月13日
    浏览(47)
  • 在Windows上安装MySQL数据库(最最最详细,超级简单)

    目录 一.确认Windows是否安装MySQL 二.下载MySQL安装包  三.添加配置文件并安装MySQL 四.登录数据库,修改密码 五.配置环境变量 六.启动MySQL 1.按【Win+R】打开运行 2.输入【services.msc】打开服务  3.在服务列表中查找MySQL,如果有mysql服务则表示Windows已经安装MySQL,如果没有MySQL服务

    2024年02月13日
    浏览(58)
  • A* 算法详解(超级详细讲解,附有大图)

    目录 引入  一.基本概念 二.算法原理 ①用宽度优先搜索 ②狄克斯特拉算法 ③A*算法 三.需要注意 四.c++伪代码 最后 今天想跟大家聊的,是我们经常用到,但是却让大家觉得十分神秘的那个算法:A* 。 这是一个远古而又非常经典的游戏——红警和 贪玩蓝月 玩的时候,就会发

    2023年04月08日
    浏览(33)
  • C语言之宏详解(超级详细!)

    目录 一、用宏前须知-#define相关知识         大致结构:          对预定义符号的补充: 二、用#define定义宏         什么是宏?         #define的替换规则: 三、常用的宏定义 1、宏定义常量 2、定义一个宏语句 3、宏定义函数         宏与函数的对比:

    2024年02月08日
    浏览(40)
  • 【共建开源】手把手教你贡献一个 SeaTunnel PR,超级详细教程!

    Apache SeaTunnel是一个非常易于使用的、超高性能的分布式数据集成平台,支持海量数据的实时同步。每天可稳定高效同步数百亿数据,已被近百家企业投入生产使用。 现在的版本不支持通过jtds的方式链接sqlserver,我们来自己写代码来实现它,并把代码提交给apache seatunnel。 1

    2024年02月09日
    浏览(52)
  • Eclipse的超级详细的安装和配置(在windows11x64下

    1、获取Eclipse安装包 链接:https://pan.baidu.com/s/19Xg6PbgIH2kr1Zug5G1Ztg 提取码:zhm6 2、解压到自己想要的目录(目录不能有中文,要不然会导致解压失败等诸多错误哦) 3、打开解压目录点解eclipse.exe执行文件开始安装eclipse 4、设置workslace(主要是存储Java代码的目录 注意:红框最好不要

    2024年02月06日
    浏览(53)
  • Spring Boot进阶(54):Windows 平台安装 MongoDB数据库 | 超级详细,建议收藏

            MongoDB是一种流行的文档型NoSQL数据库,它具有高性能、高可用性、可伸缩性等优点,因此被广泛应用于Web应用程序、分布式系统、云计算等领域。在Windows系统中安装和使用MongoDB也非常简单,只需要按照官方文档提供的步骤进行操作即可。在本篇文章中,我们将介

    2024年02月16日
    浏览(59)
  • Spring Boot入门(16):Spring Boot 整合 Swagger-UI 实现在线API接口文档 | 超级详细,建议收藏

            在现代化的软件开发中,API接口文档的编写和管理是非常重要的一环。而Swagger-UI作为一款优秀的API文档生成工具,可以帮助开发者轻松地生成并管理API接口文档,提高开发效率和代码质量。在本文中,我们将介绍如何使用Spring Boot框架和Swagger-UI工具实现在线API接

    2024年02月16日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包