用户
搜索

该用户从未签到

i春秋作家

Rank: 7Rank: 7Rank: 7

16

主题

27

帖子

249

魔法币
收听
0
粉丝
0
注册时间
2018-1-1

i春秋签约作者

发表于 2020-7-21 00:25:35 42918
本帖最后由 flag0 于 2020-7-21 00:30 编辑

本文原创作者flag0,本文属于i春秋原创奖励计划,未经许可禁止转载!

SDK入门(基础概念)

SDK - software development kit 软件开发包

应用程序=>操作系统=>输入输出设备。

操作系统提供API使应用程序操作输入输出设备。

API

API Accplcation  programing interface 应用程序编程接口

即操作系统提供的一组功能函数。

内核对象

用户和内核模式。

80386芯片的4个权限级别:0~3

Windows系统所使用的两个权限级别:0,3

操作系统运行在0环。

一阶段开发的程序运行在3环。

句柄

句柄 - 内核对象的唯一标识符。

消息机制

使用回调函数(函数指针) 来实现。

Windows是消息驱动的操作系统。

console程序与windows程序区别

任务执行不同

控制台程序只能单任务执行,windows程序可以多任务(多线程)执行。

01_2

入口函数不同

windows程序

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
  return 0;
}

控制台程序和windows程序的编译链接选项也是有所不同的。

console:/SUBSYSTEM:CONSOLE

windows:/SUBSYSTEM:WINDOWS

1592568873581

main函数参数

  • APIENTRY: __stdcall调用约定
  • _In_: 说明性宏
  • HINSTANCE hInstance: 实例句柄,代表应用程序本身。
  • HINSTANCE hPrevInstance: 已弃用,为了兼容老的入口函数。
  • LPWSTR lpCmdLine: 命令行参数。
  • int nCmdShow: 控制显示。

关闭随机基址:属性页->连接器->高级->随机基址

在Console程序中,关闭掉随机基址后,hInstance指向0x00400000

在windows程序中,关闭掉随机基址后,hInstance也是指向0x00400000

进程访问到的内存地址是虚拟的,是相互隔离的。

虚拟内存

每个32位的程序都有自己独立的4GB虚拟空间,其中低2G为用户可以操作的空间。

0~64K为保留区,高2G为操作系统操作的空间。

1592580972129

进程间的内存隔离

1592581111808

会将低2G的用户空间映射到物理内存条不同的位置,来实现内存中的每个程序的地址空间是互相隔离的。

当物理内存不够用时,会将一部分内存放到磁盘空间中。

hInstance是EXE程序在进程中的首地址,即其从磁盘拷贝向虚拟内存实从0x400000开始拷贝的。

MessageBox

查询MSDN时,选择Platform SDK版本。

1592581717217

int MessageBox(
  HWND hWnd,          //窗口句柄
  LPCTSTR lpText,     //弹窗内容
  LPCTSTR lpCaption,  //弹窗标题
  UINT uType          //弹窗类型
);

MessageBox是宏定义,采用条件编译,在UNICODE和非UNICODE之间,切换。

#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

当用ASCII时会调用MeaageBoxA,使用UNICODE的会调用MessageBoxW。

当Windows中涉及字符串的都会有两个版本。

在编译选项中,字符集位置来定义是否是UNICODE字符集。

1592583219986

多字节字符集是ASCII码(GBK编码,中文占两个字节,英文占一个字节)。

<tchar.h>中的_T()依附于条件编译宏_UNICODE

windows提供了一个类似于_T()的宏,TEXT()

MessageBox(NULL, TEXT("Hello World!"), TEXT("标题"), MB_OKCANCEL);

TEXT()_T()的区别:

TEXT()属于WindowsSDK,只能在Windows上运行不支持其他系统,_T属于C标准库<tchar.h>可以支持跨平台。

平台 头文件 开关 兼容宏
C tchar.h _UNICODE _T
Windows windows.h UNICODE TEXT

UNICODE宏开关的三个定义位置:

  1. 头文件之前定义 #define UNICODE
  2. 可以用属性->高级->字符集 来定义。
  3. 可以用 属性->C/C++ -> 预处理器 -> 预处理器定义 来定义。

Windows.h头文件中,将基础类型进行了重新定义,为了提高可读性和方便升级。

HINSTANCE --> HINSTANCE --> Handle Instance

HWND --> HWND --> Handle Window

LPWSTR --> lpWSTR --> Long Pointer Wide Str

假装自己学会了
使用道具 举报 回复
发表于 2020-7-22 11:28:37
学习了学习了,师傅很6
使用道具 举报 回复
发表于 2020-7-23 16:05:00
师傅好厉害
使用道具 举报 回复
发表于 2020-7-25 13:37:08
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册