《Windows核心编程》的笔记

2016-12-03  本文已影响0人  LiarMaiq

字符串


  1. 为了避免缓冲区溢出问题,应当避免使用不安全的字符串和内存操作函数(如:strcpy/wcscpy、strcat/wcscat)。
  2. _countof()获取字符出中字符数,避免使用(strlen/wcslen)。
  3. 定义内存分配宏#define chmalloc(nCharacters) (TCHAR)malloc(ncharacters*sizeof(TCHAR)
  4. 一般情况下,如果一个缓冲区处理函数的参数中不包括目标缓冲区的长度,那么我们应该避免使用这样的函数,同时还应该避免自己实现这样的函数,C运行库为缓冲区处理提供了一系列替代函数,比如memcpy_s memmove_s wmemcpy_s wmemmove_s这些符号定义在中,通过定义宏 __STDC_WANT_SECURE_LIB__ 以启用。
  5. 通过使用编译器标志/GS/RTCs可自动检测缓冲区溢出。
  6. 通过MultiByteToWideCharWideCharToMultiByte完成 Unicode 和 ANSI 之间的转换,传入目标字符串长度为 0 即可返回转换所需目标缓冲区字符数,MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
  7. 导出 ANSI 和 Unicode 版本的函数,通常只需定义一个 Unicode 版本的函数,而在 ANSI 版本的函数中执行字符串转换后再调用 Unicode 版本的函数,返回值也做同样的处理即可,Windows 内部也是采用这种方式,因此 Unicode 本版程序效率相对 ANSI 本版要高。
  8. API IsTextUnicode 可用来判断字符是否是 Unicode 编码,但是此方法并不是100%可靠的。

进程


  1. GetCommandLine来获取进程的完整命令行参数,但不建议试图修改命令行缓冲区。
  2. GetEnvironmentString()函数获取进程的环境块,其是在进程地址空间内分配的一块内存,其中包含的字符串和下面相似:
 =::=::\ ...
VarName1=VarValue1\0
VarName2=VarValue2\0
VarName3=VarValue3\0
VarNameX=VarValueX\0
  1. GetEnvironmentVariable(PCTSTR pszName,PTSTR pszValue,DWORD cchValue)函数获取指定环境变量的值,相似的如果参数cchValue被传入0,该函数将返回所需的字符数量,其声明:
DWORD WINAPI GetEnvironmentVariable(
  _In_opt_  LPCTSTR lpName,
  _Out_opt_ LPTSTR  lpBuffer,
  _In_      DWORD   nSize
);
  1. 函数ExpandEnvironmentStrings用于展开环境变量字符串,其声明:
DWORD WINAPI ExpandEnvironmentStrings(
  _In_      LPCTSTR lpSrc,
  _Out_opt_ LPTSTR  lpDst,
  _In_      DWORD   nSize
);

MFC

上一篇 下一篇

猜你喜欢

热点阅读