关于 Strsafe.h

缓冲区处理不当与涉及缓冲区溢出的许多安全问题有关。 Strsafe.h 中定义的函数为代码中的正确缓冲区处理提供其他处理。 因此,它们旨在替换其内置的 C/C++ 对应项以及特定的 Windows 实现。 从 Windows XP Service Pack 2(SP2)开始,Windows SDK 中提供了 Strsafe.h。

Strsafe 函数的优点包括:

  • 目标缓冲区的大小始终提供给函数,以确保该函数不会写入缓冲区末尾。

  • 即使操作截断预期结果,缓冲区也保证为 null 终止。

  • 所有函数都返回 HRESULT 值,只有一个可能的成功代码(S_OK)。

  • 每个函数在相应的字符计数(“cch”)或字节计数(“cb”)版本中可用。

  • 大多数函数都有可用于高级功能的扩展(“Ex”)版本。

有关详细信息,请参阅以下部分。

字符计数函数

以下函数使用字符计数而不是字节计数。

函数 取代
StringCchCat
StringCchCatEx
strcat、wcscat、_tcscat
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、_tcscat
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 函数