字符串
- 为了避免缓冲区溢出问题,应当避免使用不安全的字符串和内存操作函数(如:
strcpy/wcscpy、strcat/wcscat
)。
-
_countof()
获取字符出中字符数,避免使用(strlen/wcslen
)。
- 定义内存分配宏
#define chmalloc(nCharacters) (TCHAR)malloc(ncharacters*sizeof(TCHAR)
。
- 一般情况下,如果一个缓冲区处理函数的参数中不包括目标缓冲区的长度,那么我们应该避免使用这样的函数,同时还应该避免自己实现这样的函数,C运行库为缓冲区处理提供了一系列替代函数,比如
memcpy_s memmove_s wmemcpy_s wmemmove_s
这些符号定义在中,通过定义宏 __STDC_WANT_SECURE_LIB__
以启用。
- 通过使用编译器标志
/GS
和/RTCs
可自动检测缓冲区溢出。
- 通过
MultiByteToWideChar
和WideCharToMultiByte
完成 Unicode 和 ANSI 之间的转换,传入目标字符串长度为 0 即可返回转换所需目标缓冲区字符数,MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx。
- 导出 ANSI 和 Unicode 版本的函数,通常只需定义一个 Unicode 版本的函数,而在 ANSI 版本的函数中执行字符串转换后再调用 Unicode 版本的函数,返回值也做同样的处理即可,Windows 内部也是采用这种方式,因此 Unicode 本版程序效率相对 ANSI 本版要高。
- API IsTextUnicode 可用来判断字符是否是 Unicode 编码,但是此方法并不是100%可靠的。
进程
-
GetCommandLine
来获取进程的完整命令行参数,但不建议试图修改命令行缓冲区。
-
GetEnvironmentString()
函数获取进程的环境块,其是在进程地址空间内分配的一块内存,其中包含的字符串和下面相似:
=::=::\ ...
VarName1=VarValue1\0
VarName2=VarValue2\0
VarName3=VarValue3\0
VarNameX=VarValueX\0
-
GetEnvironmentVariable(PCTSTR pszName,PTSTR pszValue,DWORD cchValue)
函数获取指定环境变量的值,相似的如果参数cchValue
被传入0
,该函数将返回所需的字符数量,其声明:
DWORD WINAPI GetEnvironmentVariable(
_In_opt_ LPCTSTR lpName,
_Out_opt_ LPTSTR lpBuffer,
_In_ DWORD nSize
);
- 函数
ExpandEnvironmentStrings
用于展开环境变量字符串,其声明:
DWORD WINAPI ExpandEnvironmentStrings(
_In_ LPCTSTR lpSrc,
_Out_opt_ LPTSTR lpDst,
_In_ DWORD nSize
);
MFC
-