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 instance
LPSTR lpCmdLine, // command line
int 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:MessageBoxW
C兼容宏 _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__ *HINSTANCE
typedef 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!”
NPSTR
N : NULL
P : point
STR : 说明性,字符串
LPSTR
L : long
P : point
STR : 说明性,字符串
PSTR
P : point
STR : 说明性,字符串
LPCSTR
L : long
P : point
C : const
STR : 说明性字符串
PCSTR
P : point
C : const
STR : 说明性字符串