这本书绝对经典,看看定会增加不少知识。当然这本书有很多东西比《Windows程序设计第五版》中的更加详细。

1、Unicode:宽字节字符集
  这是一个国际的字符标准,16位,最大可支持65000个字符,完全可以应付全球所有语言。在Windows实际使用中,可以使用Micrsoft公司的API,也可以定义两个宏(UNICODE AND _UNICODE),就可以修改然后重新编译源文件。在实际使用中如果可以最好使用Unicode字符替代ANSI字符。
2、C运行库对Unicode的支持
  对于一些常用的数据类型和函数,Unicode都有与之对应。
  如数据类型wchar_t

  定义为typedef unsigned short wchar_t;
  一些函数,如strcat,strchr,strcpy,strlen等都有wcscat,wcschr,wcscpy,wcslen与之相对应。
  所有的Unicode函数均以wcs开头,wcs是宽字符串的英文缩写。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。如果想在创建双重作用的代码,支持ANSI和Unicode格式,可以使用头文件TChar.h,该文件包含一组宏,假如你在程序中定义了unicode宏,这些宏就选择wcs相关的函数,要是_Unicode宏,就选择str一类的函数。
  其中在TChar.h中包含一些数据类型的定义,如TCHAR,_Unicode下是typedef wchar_t TCHAR;Unicode下是typedef char TCHAR;
还有就是宏_TEXT以及大写字母L,在字符串前加L表示将该字符当作Unicode字符,其功能有宏_TEXT实现。
Windows2000 以后Micrsoft全面支持Unicode,所有的API都是重新设计的,每个ANSI函数都有Unicode对应的函数。

  在实际当中的选择方法就是这样:
  #ifdef UNICODE
  #define CreateWindowEx CreateWindowExW
  #else
  #define CreateWindowEx CreateWindowExA
  #endif
3、如何确定一个文本文件是不是Unicode字符

  可以使用IsTextUnicode()ha函数确定。但是这个函数有时不太准确。
  DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT PrESULT);
  第一个参数pvBuffer用于标识要测试的缓存的地址。该数据是个无效指针,因为你不知道你拥有的是ANSI字符数组还是Unicode字符数组。
  第二个参数cb用于设定pvBuffer指向的字节数。同样,由于你不知道缓存中放的是什么,因此cb是个字节数,而不是字符数。请注意,不必设定缓存的整个长度。当然,IsTextUnicode能够测试的字节越多,得到的结果越准确。
  第三个参数pResult是个整数的地址,必须在调用IsTextUnicode之前对它进行初始化。对该整数进行初始化后,就可以指明你要IsTextUnicode执行哪些测试。也可以为该参数传递BULL,在这种情况下IsTextUnicode将执行它能够进行的所有测试(详细说明请参见 Platform SDK文档)。
4、在Unicode和ANSI之间转换

  MultiByteToWideChar();
  WideCharToMultiByte();

  具体情况参考原著。
5、内核对象
  这个貌似很复杂。内核对象是内核分配的一个内存块,并且只能有该内核访问。
  内核对象的创建几乎都会包含一个成员函数,指向SECURITY_ATTRIBUTES结构的指针,
  如何区分内核对象和用户对象、图形设备接口对象?
  创建内核对象的所有函数几乎都有一个参数---安全属性参数,而其他的则没有这个参数。

6、多进程之间共享内核对象
第一,改变句柄的标志,使用SetHandleInformation()函数
  BOOL SetHandleInformation(HANDLE hObject,DWORD dMask,DWORD deFlags);
  第一个参数表示一个有效的句柄;
  第二个表示要改变的标志,包括两个:
  #define HANDLE_FLAG_INHERIT 0X00000001 //可继承标志
  #define HANDLE_FLAG_PROTECT_FROM_CLOSE 0X00000002 //关闭保护标志
  第三个参数表示要设置的成的标志。
第二,使用命名对象
    可使用如下函数创建CreateMutex(),CreateEvent(),CreateSemaphore(),CreateWaitableTimer(),CreateFileMapping(),CreateJobObject();

  这么多的函数都有一个相同的参数pszName,表示对象的名称。为NULL时指向一个匿名的内核对象。    如果内核对象已经存在则可以使用以下函数打开对象:   OpenMutex(),OpenEvent(),OpenSemaphore(),OpenWaitableTimer(),OpenFileMapping(),OpenJobObject();

  这些函数的最后一个参数pszName不能为空。
第三,使用DuplicationHandle(),复制对象句柄
  该函数取出一个进程的句柄表中的项目,并将该项目拷贝到另一个进程的句柄表中。
  每当系统中启动一个新进程时都会创建一个进程内核对象。

刚看了一部分,发现这本书真的不是一遍能看明白的,也许将来还需要多加研习。

Windows核心编程小结1的更多相关文章

  1. Windows核心编程小结3

    内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...

  2. Windows核心编程小结2

    这一节看看内存管理相关的信息 首先看看虚拟内存 虚拟地址空间 32位系统  --- 4GB = 232 64 位系统  ---- 16EB = 264 虚拟内存表 当一个应用程序从硬盘加载到RAM时, ...

  3. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  4. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  5. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  6. windows核心编程---第二章 字符和字符串处理

        使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...

  7. 回忆读windows 核心编程

    看<windows 核心编程> 第五版到纤程了,下一章节即将介绍内存体系编程.如果做window平台下的开发,我感觉此书一定要读.记得开始讲解了window的基础,然后讲解内核对象.内核对 ...

  8. 《Windows核心编程》第5版 学习进度备忘

    学习资源:<Windows核心编程>第5版 知识基础支持: 本书与<Windows程序设计>第5版珍藏版结合很好,二者重叠内容不多,二者互补性强,而且相关方面的优秀书籍 跳过的 ...

  9. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

随机推荐

  1. 使用kvm制作Eucalyptus镜像(Windows Server 2008r2为例)

    1.前言 Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...

  2. HDevEngine in .NET Applications MultiThreading

    Basics To use HDevEngine in Visual Studio .NET, you must add a reference to the HALCON/.NET assembly ...

  3. 【Quartus警告】created implicit net for XXX.

    [警告内容]Warning (10236): Verilog HDL Implicit Net warning at forward_replace.v(16): created implicit n ...

  4. JPA将查询结果转换为DTO对象

    前言 JPA支持使用@Query自定义查询,查询的结果需要字节用DTO对象接收,如果使用HQL的查询语句,可以将直接将DTO对象的构造方法传入hql中,直接转为DTO对象:而如果使用native sq ...

  5. 爬虫爬取代理IP池及代理IP的验证

    最近项目内容需要引入代理IP去爬取内容. 为了项目持续运行,需要不断构造.维护.验证代理IP. 为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP. 一.服务器如何获取客户端IP ...

  6. vuejs计算属性和侦听器

    <div id='root'> 姓:<input v-model='firstName'/> 名:<input v-model='secondName'/> < ...

  7. 外网访问FTP服务,解决只能以POST模式访问Filezilla的问题

    在内网可以正常使用PASV,但是在外网不行,导致数据传输慢或者根本连接不了,在FlashFXP中通过日志,找到了解决方法解决方法1.在Filezilla——Edit——Settings——Passiv ...

  8. 在maven项目中 配置代理对象远程调用crm

    1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...

  9. 移动端调试利器-vConsole

    现在移动端开发越来越火,随之而来的问题也越来越多,今天给大家介绍一款移动端调试神器,vconsole. 一.先引用文件,可以从https://www.bootcdn.cn/vConsole/下载,也可 ...

  10. <转载>一般筛法和快速线性筛法求素数

    素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用 ...