SDK第一课(Windows SDK编程入门)

郑俊美
2023-12-01

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 : 说明性字符串
 类似资料: