Windows核心编程小结1
这本书绝对经典,看看定会增加不少知识。当然这本书有很多东西比《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的更多相关文章
- Windows核心编程小结3
内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...
- Windows核心编程小结2
这一节看看内存管理相关的信息 首先看看虚拟内存 虚拟地址空间 32位系统 --- 4GB = 232 64 位系统 ---- 16EB = 264 虚拟内存表 当一个应用程序从硬盘加载到RAM时, ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程---第九章 同步设备IO与异步设备IO之同步IO
同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- windows核心编程---第二章 字符和字符串处理
使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是指UTF-16.也 ...
- 回忆读windows 核心编程
看<windows 核心编程> 第五版到纤程了,下一章节即将介绍内存体系编程.如果做window平台下的开发,我感觉此书一定要读.记得开始讲解了window的基础,然后讲解内核对象.内核对 ...
- 《Windows核心编程》第5版 学习进度备忘
学习资源:<Windows核心编程>第5版 知识基础支持: 本书与<Windows程序设计>第5版珍藏版结合很好,二者重叠内容不多,二者互补性强,而且相关方面的优秀书籍 跳过的 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
随机推荐
- Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...
- Eucalyptus(v4.0)系统需求
1.计算需求 Physical Machines: All Eucalyptus components must be installed on physical machines, not virt ...
- [转]iOS开发总结之代码规范
转自:http://www.cocoachina.com/ios/20151014/13678.html 命名规范 总 的来说, iOS命名两大原则是:可读性高和防止命名冲突(通过加前缀来保证). O ...
- nginx搭建流媒体服务器
1.安装PCRE库 到www.pcre.org 下载pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.37 ./configure make ...
- JPA将查询结果转换为DTO对象
前言 JPA支持使用@Query自定义查询,查询的结果需要字节用DTO对象接收,如果使用HQL的查询语句,可以将直接将DTO对象的构造方法传入hql中,直接转为DTO对象:而如果使用native sq ...
- frombuffer的用法
函数原型为:numpy.ma.frombuffer(buffer, dtype=float, count=-1, offset=0) import numpy s = 'hello world' pr ...
- C++手写快读详解(快速读入数字)
众所周知,C++里是自带读入的(这不废话吗) 例如: int a; cin>>a; 这样的读入理解简单,适合初学者,但是非常慢. 再例如: int a; scanf("%d&qu ...
- vue列表过渡效果
<transition-group></transition-group> ① 列表 <transition-group> </transition-grou ...
- 架构图(拓扑图)画图工具分析整理(静态,动态,可交互图.层级tu)
最近要画架构图. 一方面有图片洁癖,另外一方面又不想不停的挪动图片. 一开始想用脑图软件. 发现脑图是树状的,架构模块依赖图是网状的.(也可以简化为层级图,不画交互关系.类似 dubbo 的架构图. ...
- SunmmerVocation_Learning--Java数组的创建
一维数组声明方式: type var[] 或 type[] var; 如int a[], int[] a; Java中声明数组不能指定其长度,如int a[5]是非法的. 一维数组对象的创建: Jav ...