zoukankan      html  css  js  c++  java
  • 【Windows SDK学习】基础概念介绍

     

    什么是Windows SDK?

    SDK即Software Develope Kit(软件开发工具包),它包含了进行Windows软件开发的文档和API函数的输入库、头文件(因为API在动态链接库中,这些动态链接库是系统的组成部分,因此不用再提供,而输入库和头文件则必须,这样才能在你的程序中使用API函数)。

    早期SDK是一个单独发放的包,现在在Visual C++和其他一些开发环境中已经包含了它,如果你已经安装了VC++,那么就可以开始编写Windows程序了。

    本文是 i 春秋论坛作家「flag0」表哥原创的关于Windows SDK学习的系列文章,公众号旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。

    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

     

    main函数参数

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

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

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

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

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

    虚拟内存

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

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

     

    进程间的内存隔离

     

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

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

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

    MessageBox

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

     

    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字符集。

     

    多字节字符集是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>可以支持跨平台。

     

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

    1、头文件之前定义 #define UNICODE;

    2、可以用属性->高级->字符集 来定义;

    3、可以用 属性->C/C++ -> 预处理器 -> 预处理器定义 来定义。

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

    HINSTANCE --> HINSTANCE --> Handle Instance

    HWND --> HWND --> Handle Window

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

    以上是今天要分享的内容,大家看懂了吗?

  • 相关阅读:
    下载Web微信视频
    强制删除无用old windows文件夹命令
    BitLocker 加密工具挂起和恢复命令行(windows7)
    R 统计学工具部署和使用
    Microsoft Azure 01 (Summarize)
    RocketMQ原理
    专业术语概念
    序列化-ProtoBuf
    Kafka安装与集群部署
    Redis中使用Lua脚本
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/13489484.html
Copyright © 2011-2022 走看看