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

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

  • 相关阅读:
    WCF实现上传图片功能
    C#中String.Empty、NULL与""三者的区别
    C#中equal与==的区别
    static 关键字的使用,静态和非静态类的区别
    C#索引器
    C# 接口的隐式与显示实现说明
    Python文件处理
    Python3.X与urllib
    python中if __name__ == '__main__'
    Python中的random模块
  • 原文地址:https://www.cnblogs.com/songliquan/p/3356322.html
Copyright © 2011-2022 走看看