SDK第一课(Windows SDK编程入门)
SDK (Software Development Kit) 软件开发工具包
Windows应用接口程序接口(API)(应用程序<--------->操作系统<--------->输出输入设备)
A:API(Application Programming Interface,应用编程接口)
B:内核对象(用户模式和内核模式权限级别)
- 内核:M0到M3
- 用户:M0和M3(最低权限与最高权限)
- 操作系统内部的受保护只能通过指定API来访问的对象
C:句柄(操作系统的内核对象的ID )
D:消息机制(查阅相关文档补全笔记)
- Windows是消息驱动的操作系统
- 系统将各种输入封装成一个消息结构体(包含输入的种类和输入的相关信息),通过回调的方式,调用应用程序实现的输入处理函数
Windows程序与console程序
进程间的内存隔离(每个进程分配4G内存,高2G系统内存指向同一块区域,低2G用户内存都是独立的)
- 虚拟内存
- 系统空间(高地址):0X80000000-0XFFFFFFFF
- 用户空间(低地址):0X00000000-0X7FFFFFFF
- 物理内存:
- 线程:一个进程可以有多个线程
任务
- Windows:多任务
- console(DOS):单任务
入口函数
- windows:WinMain
- console:main
链接选项
- Windows:/SUBSYSTEM:WINDOWS
- console:/SUBSYSTEM:CONSOLE
WinMain解析
来源:Windows Platform SDK
系统调用WinMain函数作为基于windows的应用程序的初始入口点。
头文件:Windows.h
int WINAPI WinMain(HINSTANCE hInstance, // handle to current instance,实例句柄,代表应用层本身,实际上是可执行文件在内存中的首地址HINSTANCE hPrevInstance, // handle to previous instanceLPSTR lpCmdLine, // command lineint nCmdShow // show state
);
- Parameters
- hInstance 当前实例的句柄
- hPrevInstance 前一个实例的句柄。这个参数总是NULL。如果需要检测另一个实例是否已经存在,请使用CreateMutex函数创建一个惟一命名的互斥对象。即使互斥对象已经存在,CreateMutex也会成功,但是GetLastError函数将返回ERROR_ALREADY_EXISTS。这表示应用程序的另一个实例存在,因为它首先创建了互斥锁。
- lpCmdLine 指向一个以null结尾的字符串的指针,该字符串指定应用程序的命令行,但不包括程序名。要检索整个命令行,请使用GetCommandLine函数。
- nCmdShow 显示窗口
- SW_HIDE 隐藏窗口并激活另一个窗口。
- SW_MAXIMIZE 最大化指定的窗口。
- SW_MINIMIZE 最小化指定的窗口并按Z顺序激活下一个顶级窗口。
- SW_RESTORE 激活并显示窗口。如果窗口被最小化或最大化,系统会将其恢复到原来的大小和位置。应用程序应该在恢复最小化窗口时指定此标志。
- SW_SHOW 激活窗口并显示其当前大小和位置。
- SW_SHOWMAXIMIZED 激活窗口并将其显示为最大化窗口。
- SW_SHOWMINIMIZED 激活窗口并将其显示为最小化窗口。
- SW_SHOWMINNOACTIVE 不激活窗口,将窗口显示为最小化窗口。类似于sw_show。
- SW_SHOWNA 不激活窗口,显示窗口的当前大小和位置。类似于SW_SHOW,。
- SW_SHOWNOACTIVATE 不激活窗口,显示窗口的最新大小和位置。类似于SW_SHOWNORMAL,。
- SW_SHOWNORMAL 激活并显示窗口。如果窗口被最小化或最大化,系统会将其恢复到原来的大小和位置。应用程序应该在第一次显示窗口时指定此标志。
- Return Values
- 如果函数成功,当它接收到WM_QUIT消息时终止,它应该返回该消息的wParam参数中包含的退出值。如果函数在进入消息循环之前终止,它应该返回零。
- Remarks
- 您的WinMain应该初始化应用程序,显示其主窗口,并输入一个消息检索和分派循环,该循环是应用程序其余执行的顶级控制结构。当接收到WM_QUIT消息时终止消息循环。此时,WinMain应该退出应用程序,返回在WM_QUIT消息的wParam参数中传递的值。如果WM_QUIT是由于调用PostQuitMessage而接收到的,那么wParam的值就是PostQuitMessage函数的nExitCode参数的值。有关更多信息,请参见创建消息Lo
- ANSI应用程序可以使用WinMain函数的lpCmdLine参数访问命令行字符串,但不包括程序名。WinMain不能返回Unicode字符串的原因是lpCmdLine使用LPSTR数据类型,而不是LPTSTR数据类型。GetCommandLine函数可以用于访问命令行中的Unicode字符串,因为它使用LPTSTR数据类型。
MessageBox解析
来源:Windows Platform SDK
头文件:Windows.h
使用:User32.lib
在所有平台上实现为Unicode和ANSI版本。Microsoft Layer也支持Unicode。
ASCII:MessageBoxA
Unicode:MessageBoxWC兼容宏 _T _UNICODE #include <tchar.h>
SDK兼容宏 TEXT UNICODE #include <windows.h>int MessageBox(HWND hWnd, // handle to owner window LPCTSTR lpText, // text in message box LPCTSTR lpCaption, // message box title UINT uType // message box style
);
- MessageBox函数创建、显示和操作一个消息框。消息框包含应用程序定义的消息和标题,以及预定义图标和按钮的任何组合。
- Parameters
- hWnd 要创建的消息框的所有者窗口的句柄。参数为NULL,消息框没有父窗口。
- lpText 指向以null结尾的字符串的指针,该字符串包含要显示的消息。
- lpCaption 指向以null结尾的字符串的指针,该字符串包含对话框标题。参数为NULL,使用默认的标题.
- uType 指定对话框的内容和行为。指示消息框中显示的按钮
- Return Values(如果函数失败,返回值为零。要获取扩展的错误信息,请调用GetLastError,如果函数成功,返回值是以下菜单项值之一。)
- IDABORT 终止
- IDCANCEL 取消
- IDCONTINUE 继续
- IDIGNORE 忽略
- IDNO 否
- IDOK 确定
- IDRETRY 重试
- IDTRYAGAIN 再试一次
- IDYES 是
- Icon
- MB_ICONEXCLAMATION, MB_ICONWARNING 感叹号
- MB_ICONINFORMATION, MB_ICONASTERISK 由小写字母i组成的图标。
- MB_ICONQUESTION 问号
- MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND 停止标志
- Buttons
- MB_ABORTRETRYIGNORE 中止、重试、忽略
- MB_CANCELTRYCONTINUE 取消、重试、继续
- MB_HELP 当用户单击Help按钮或按F1时,系统向所有者发送WM_HELP消息。
- MB_OK 默认值,ok
- MB_OKCANCEL ok、取消
- MB_RETRYCANCEL 重试、取消
- MB_YESNO 是、否
- MB_YESNOCANCEL 是、否、取消
- Modality(重点有关线程,后期补充查阅资料文档)
- MB_APPLMODAL
- MB_SYSTEMMODAL
- MB_TASKMODAL
- Default Button
- MB_DEFBUTTON1,MB_DEFBUTTON2,MB_DEFBUTTON3,MB_DEFBUTTON4 第N个按钮是默认按钮
- 其他
- MB_DEFAULT_DESKTOP_ONLY
- MB_RIGHT
- MB_RTLREADING
- MB_SETFOREGROUND
- MB_TOPMOST
- MB_SERVICE_NOTIFICATION
- MB_SERVICE_NOTIFICATION_NT3X
typedef 说明宏解析 例:
HWND H WND H-handle WND-window 句柄 窗口对象
HPROCESS H-handle PROCESS-Process 句柄 进程对象
HINSTANCE H-handle INSTANCE-instance 句柄 应用程序实例
HICON H-handle ICON-icon 句柄 图标
LPCWSTR LP C W STR LP-long point指针 C-const W-wchar_t STR-说明性,字符串
展开例子:
DECLARE_HANDLE(HINSTANCE);
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
struct HINSTANCE__
{int unused;
};typedef struct HINSTANCE__ *HINSTANCEtypedef void* HINSTANCE
####### 创建一个窗口的六要素
- 设计注册窗口类
- 创建窗口实例
- 显示窗口
- 更新窗口
- 实现消息循环
- 实现窗口回调
Windows API 调用??????
事件驱动,消息响应???????
####书籍学习资料推荐
- SDK(windows程序设计第5版)
- MFC+QT(深入浅出MFC,QTCreator快速入门,QT4Gui编程)
- Windows编程(动态库,静态库,多线程,进程间操作)(Windows核心编程)
- 网络编程(upd,tcp,icmp,http,异步模型–select,iocp)(linux 网络编程)
- 数据库(SQL语句)
- COM
作业:
手工书写一个Windows版本的SDK程序
将Demo中的WinMain函数改为C语言的main,并在链接的时候用/subsystem:console参数会有什么不同
不包含Windows.h,弹框 “Hello, world!”
NPSTRN : NULLP : pointSTR : 说明性,字符串LPSTRL : longP : pointSTR : 说明性,字符串PSTRP : pointSTR : 说明性,字符串LPCSTRL : long P : pointC : constSTR : 说明性字符串PCSTRP : pointC : constSTR : 说明性字符串
SDK第一课(Windows SDK编程入门)相关推荐
- 【梅哥的Ring0湿润插入教程】第一课Windows内核/驱动编程概述及应用、商业驱动保护软件原理分析...
[梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 第一课Windows内核/驱动编程概述及应用. 商业驱动保护软 ...
- C语言探索之旅 | 第二部分第一课:模块化编程
C语言之父 Dennis Ritchie -- 简书作者 谢恩铭 转载请注明出处 第二部分第一课:模块化编程 上一课是C语言探索之旅 | 第一部分第十课:练习题+习作,至此,我们[C语言探索之旅]的第 ...
- C# Windows 窗体编程入门详解
C# Windows 窗体编程入门详解 基于Web的B/S架构应用程序近年来确实非常流行,B/S易于部署.易于维护的特点使Web应用程序开发得到了前所未有的发展.但是,Web应用程序的缺点是,它们有时 ...
- c语言程序第一章编程,c语言程序的设计第一章 C语言编程入门.ppt
c语言程序的设计第一章 C语言编程入门 第1章 C语言编程入门 本章是本书的入门篇,专为初学者熟悉编程过程.掌握程序结构而准备的. 本章学习目标 ? 1)? 能够通过模仿与改变来构造带有测试函数的C语 ...
- Windows网络编程入门:简单的客户端和服务器通信程序调试
昨日入手Windows网络编程经络这本书,第一章给了Echo客户端和服务器的简单通信实例程序.从小白到入门目测都是比较苦逼,居然想不到怎么来测试结果.什么同时运行啊.分别编译运行啊乱七八糟的想法就开始 ...
- Windows MFC编程入门——应用程序框架
一.SDK应用程序与MFC应用程序运行过程对比 程序运行都要有入口函数,在C/C++程序中都是main函数,而windows应用程序的入口函数是WinMain或wWinMain.MFC程序也是从这个入 ...
- python编程入门第一课教案_python编程从入门到实践 第一课:输入输出
#print()函数使用 messger="hello python world!" print(messger) hello python world! 1.使用"#& ...
- c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]
Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...
- 字节青训营第一课之go语言入门的笔记和总结
有幸参加了字节跳动举办的青训营活动,主要是go语言的编程实践,我将会整理课程的笔记和总结,欢迎关注! 1Go语言简介 由于Go语言有语法简单.高性能等特点,因此国内外各大公司如谷歌.腾讯.字节等都在使 ...
最新文章
- Hive MetaStore 在快手遇到的挑战与优化
- 中兴智能视觉大数据报:要注意,人工智能将衍生更多工作机会
- 【转】QString 与中文问题
- utxo模型_什么是UTXO?简析账户/余额模型和UTXO模型
- Swin Transformer升级版来了!30亿参数,刷榜多项视觉任务
- Bootstrap手机网站开发案例
- java 内存泄漏 工具_Java剖析工具JProfiler入门使用教程:查找内存泄漏的方法
- 在Java中处理异常
- 导出oracle数据c#代码,C# 程序导入导出oracle数据库
- dev项目属性按钮是灰色_如何当按钮处于各种交互状态时具有不同样式的按钮?...
- Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E>
- 测试先知和启发式方法
- [luoguP3332] [ZJOI2013]K大数查询(树套树)
- 【 CPLEX安装】
- Windows 微软雅黑(Microsoft YaHei)+ Monaco 字体整合方案
- 能学习计算机考证的手机软件有那些?推荐
- 二进制与十进制的转换
- LINGO进行灵敏度分析为何总提醒92/237错误
- OpenJ_Bailian - 2692 假币问题
- pdf文件如何删除其中一页内容
热门文章
- 华为手机居然还能这样提高续航?简单设置一下,一天一充很轻松
- 惠州市城市职业学院计算机考点,2020广东乡镇惠州考区笔试考点地理位置及考场安排表...
- 基于ssm+jsp的大学生体能训练营管理系统毕业设计源码211633
- 系统架构设计师论文历年考题(2015-2017)考前冲刺来一波真题
- 前端 传表格多条数据 给后台接收 (HTML前端表格多条数据JSON封装后;异步提交到后台处理)
- 当计算机没有网时,怎么连接网络?
- Vue和layUI的区别何在?
- HEVC帧内预测参考相邻帧代码解析
- 魔方还原神器,有了它,没有还原不了的魔方(15)
- 用JavaScript写的一个摇号程序(随机数)