• 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(),复制对象句柄
      该函数取出一个进程的句柄表中的项目,并将该项目拷贝到另一个进程的句柄表中。
      每当系统中启动一个新进程时都会创建一个进程内核对象。

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

  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/songliquan/p/3356322.html
Copyright © 2020-2023  润新知