1、Microsoft将COM从16位Windows移植到WIn32时,做出了一个重要决策:所有需要字符串作为参数的COM接口方法都 只接受Unicode字符串。因为COM一般用于让不同组件彼此间进行“对话”,而Unicode是传递字符串最理想的选择。
2、当资源编译器译完所有资源后,输出文件就是资源的一个二进制形式。资源中的字符串值 (字符串表、对话框模板、菜单等)始终是以Unicode字符串的形式保存的。
3、在每个变量后的内存都会被填充为0xcc,这样是为了能够在自动检测中,检查出缓冲区溢出。
4、_countof是一个宏,来获取字符大小。
5、GetThreadLocale这个来返回系统的语言标识符。
6、IsTextUnicode这个来判断某一个文本内容是否为Unicode编码。
7、一般系统调用函数会有两个版本,分别是Unicode与ANSI两种版本。其实ANSI运行起来更复杂。因为在ANSI内部其实还是调用的Unicode版本的函数,于是就存在一个参数转换的问题,将ANSI参数转换成Unicode,然后再去调用Unicode版本的函数。所以直接调用Unicode版本的函数运行会更快。
8、内核对象可以用一个安全描述符(security descriptor, SD)来保护。
9、内核对象有一个静态成员用来计数,当内核对象被创建时计数值为1,如果有其他进程访问此内核对象(通过特殊的进程共享内核对象的方式)则计数值加1,进程结束,计数值减1,如果计数为0,则系统内核会释放此内核对象。
10、内核对象的作用域是基于进程的,这样做处于安全和健壮型考虑,而且只有通过调用windows api 才能使用内核对象。
11、将NULL作为PSECURITY_ATTRIBUTES参数传入时,返回的句柄是不可继承的。
12、当一个子进程继承了父进程的内核对象的句柄时,句柄在父、子进程中的索引是一样的。
13、对象句柄的继承只会发生在生成子进程的时候发生。假如父进程后来又创建了新的内核对象,并同样将它们的句柄设为可继承的句柄。那么正在运行的子进程是不会继承这些新的句柄的。
14、一个服务的命名内核对象始终位于全局命名空间内。应用程序自己的命名内核对象在会话的命名空间内。不过,我们也可以强制把一个命名对象放入全局命名空间,具体 做法是在其名称前加上“Global”前缀。如:
HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Global\MyName"));
也可以将一个内核对象放入到当前会话的命名空间,在名称前加上“Local”前缀,如
HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Local\MyName")):
15、Security identifier(安全描述符),SID
16、通过CreateBoundaryDescriptor创建的边界,不要用CloseHandle关闭,而是用DeleteBoundaryDescriptor;
17、伪句柄其实就是指的是指调用函数的本身线程句柄。