字符串
- 為了避免緩沖區(qū)溢出問題邓夕,應(yīng)當(dāng)避免使用不安全的字符串和內(nèi)存操作函數(shù)(如:
strcpy/wcscpy、strcat/wcscat
)。 -
_countof()
獲取字符出中字符數(shù),避免使用(strlen/wcslen
)渊额。 - 定義內(nèi)存分配宏
#define chmalloc(nCharacters) (TCHAR)malloc(ncharacters*sizeof(TCHAR)
。 - 一般情況下垒拢,如果一個緩沖區(qū)處理函數(shù)的參數(shù)中不包括目標(biāo)緩沖區(qū)的長度旬迹,那么我們應(yīng)該避免使用這樣的函數(shù),同時還應(yīng)該避免自己實現(xiàn)這樣的函數(shù)求类,C運(yùn)行庫為緩沖區(qū)處理提供了一系列替代函數(shù)奔垦,比如
memcpy_s memmove_s wmemcpy_s wmemmove_s
這些符號定義在中,通過定義宏__STDC_WANT_SECURE_LIB__
以啟用尸疆。 - 通過使用編譯器標(biāo)志
/GS
和/RTCs
可自動檢測緩沖區(qū)溢出椿猎。 - 通過
MultiByteToWideChar
和WideCharToMultiByte
完成 Unicode 和 ANSI 之間的轉(zhuǎn)換,傳入目標(biāo)字符串長度為 0 即可返回轉(zhuǎn)換所需目標(biāo)緩沖區(qū)字符數(shù)寿弱,MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx犯眠。 - 導(dǎo)出 ANSI 和 Unicode 版本的函數(shù),通常只需定義一個 Unicode 版本的函數(shù)症革,而在 ANSI 版本的函數(shù)中執(zhí)行字符串轉(zhuǎn)換后再調(diào)用 Unicode 版本的函數(shù)筐咧,返回值也做同樣的處理即可,Windows 內(nèi)部也是采用這種方式噪矛,因此 Unicode 本版程序效率相對 ANSI 本版要高量蕊。
- API IsTextUnicode 可用來判斷字符是否是 Unicode 編碼,但是此方法并不是100%可靠的艇挨。
進(jìn)程
-
GetCommandLine
來獲取進(jìn)程的完整命令行參數(shù)残炮,但不建議試圖修改命令行緩沖區(qū)。 -
GetEnvironmentString()
函數(shù)獲取進(jìn)程的環(huán)境塊缩滨,其是在進(jìn)程地址空間內(nèi)分配的一塊內(nèi)存势就,其中包含的字符串和下面相似:
=::=::\ ...
VarName1=VarValue1\0
VarName2=VarValue2\0
VarName3=VarValue3\0
VarNameX=VarValueX\0
-
GetEnvironmentVariable(PCTSTR pszName,PTSTR pszValue,DWORD cchValue)
函數(shù)獲取指定環(huán)境變量的值,相似的如果參數(shù)cchValue
被傳入0
脉漏,該函數(shù)將返回所需的字符數(shù)量蛋勺,其聲明:
DWORD WINAPI GetEnvironmentVariable(
_In_opt_ LPCTSTR lpName,
_Out_opt_ LPTSTR lpBuffer,
_In_ DWORD nSize
);
- 函數(shù)
ExpandEnvironmentStrings
用于展開環(huán)境變量字符串,其聲明:
DWORD WINAPI ExpandEnvironmentStrings(
_In_ LPCTSTR lpSrc,
_Out_opt_ LPTSTR lpDst,
_In_ DWORD nSize
);