關於 Strsafe.h

在涉及緩衝區溢位的許多安全性問題中,緩衝區處理不佳。 Strsafe.h 中定義的函式會提供額外的處理,以在程式碼中正確處理緩衝區。 基於這個理由,它們的目的是要取代其內建 C/C++ 對應專案,以及特定的Windows實作。 從 service Pack 2 Windows XP (SP2) 開始,Windows SDK 中提供 Strsafe.h。

Strsafe 函式的優點包括:

  • 目的地緩衝區的大小一律會提供給 函式,以確保函式不會寫入緩衝區結尾。

  • 即使作業截斷預定的結果,緩衝區仍保證為 Null 終止。

  • 所有函式都會傳回 HRESULT 值,其中只有一個可能的成功程式碼 (S_OK) 。

  • 每個函式都可在對應的字元計數 (「cch」) 或位元組計數 (「cb」) 版本使用。

  • 大部分函式都有適用于進階功能的擴充 (「Ex」) 版本。

如需詳細資訊,請參閱下列各節。

字元計數函式

下列函式會使用字元計數,而不是位元組計數。

函式 取代
StringCchCat
StringCchCatEx
strcat、wcscat、_tcsat
lstrcat
StrCat
StrCatBuff
StringCchCatN
StringCchCatNEx
strncat
StrNCat
StringCchCopy
StringCchCopyEx
strcpy、wcscpy、_tcscpy
lstrcpy
StrCpy
StringCchCopyN
StringCchCopyNEx
strncpy、wcsncpy、_tcsncpy
StringCchGets
StringCchGetsEx
取得、_getws、_getts
StringCchPrintf
StringCchPrintfEx
sprintf、swprintf、_stprintf
wsprintf
wnsprintf
_snprintf、_snwprintf、_sntprintf
StringCchVPrintf
StringCchVPrintfEx
vsprintf、vswprintf、_vstprintf
vsnprintf、_vsnwprintf、_vsntprintf
wvsprintf
wvnsprintf
,
StringCchLength
strlen、wcslen、_tcslen

 

位元組計數函式

下列函式會使用位元組計數,而不是字元計數。

函式 取代
StringCbCat
StringCbCatEx
strcat、wcscat、_tcsat
lstrcat
StrCat
StrCatBuff
StringCbCatN
StringCbCatNEx
strncat
StrNCat
StringCbCopy
StringCbCopyEx
strcpy、wcscpy、_tcscpy
lstrcpy
StrCpy
StringCbCopyN
StringCbCopyNEx
strncpy、wcsncpy、_tcsncpy
StringCbGets
StringCbGetsEx
取得、_getws、_getts
StringCbPrintf
StringCbPrintfEx
sprintf、swprintf、_stprintf
wsprintf
wnsprintf
_snprintf、_snwprintf、_sntprintf
StringCbVPrintf
StringCbVPrintfEx
vsprintf、vswprintf、_vstprintf
vsnprintf、_vsnwprintf、_vsntprintf
wvsprintf
wvnsprintf
StringCbLength
strlen、wcslen、_tcslen

 

使用 Strsafe.h

  • 若要內嵌使用 Strsafe 函式,請包含標頭檔,如下所示,遵循所有其他標頭檔 #include 語句。

    #include <strsafe.h>

  • 若要在程式庫表單中使用函式,請在包含 Strsafe.h 之前包含下列語句。 不過,建議您使用內嵌函式。

    #define STRSAFE_LIB

    注意

    :下列函式必須當做內嵌函式使用:StringCbGetsStringCbGetsExStringCchGets 和 StringCchGetsEx

     

  • 當您在檔案中包含 Strsafe.h 時,Strsafe.h 函式所取代的較舊函式將會被取代。 嘗試使用這些較舊的函式會導致編譯器錯誤,告知您使用較新的函式。 如果您想要覆寫此行為,請先包含下列語句,再包含 Strsafe.h。

    #define STRSAFE_NO_DEPRECATE

  • 若要只允許字元計數函式,請在包含 Strsafe.h 之前包含下列語句。

    #define STRSAFE_NO_CB_FUNCTIONS

  • 若要只允許位元組計數函式,請在包含 Strsafe.h 之前包含下列語句。

    #define STRSAFE_NO_CCH_FUNCTIONS

    注意

    您可以定義 STRSAFE_NO_CB_FUNCTIONSSTRSAFE_NO_CCH_FUNCTIONS,但不能同時定義兩者。

     

  • 某些 Strsafe 函式具有地區設定感知版本。 根據預設,標頭不會宣告這些函式。 若要啟用這些宣告,請先包含下列巨集式,再包含 Strsafe.h。

    #define STRSAFE_LOCALE_FUNCTIONS

  • 支援的字串長度上限為 2,147,483,647 (STRSAFE_MAX_CCH) 字元,可以是 ANSI 或 Unicode。

Strsafe 函式