Strsafe.h について
バッファーの処理が不適切なのは、バッファー オーバーランを伴う多くのセキュリティの問題に関係しています。 Strsafe.h で定義されている関数は、コード内で適切なバッファー処理のための追加処理を提供します。 このため、組み込みの C/C++ に対応する、および特定の Windows 実装を置き換えることを目的としています。 Strsafe.h は、Windows XP Service Pack 2 (SP2) 以降の Windows SDK で使用できます。
Strsafe 関数の利点は次のとおりです。
バッファの終端を越える書き込みが発生しないようなサイズの出力先バッファが、関数に必ず用意されます。
意図する結果が演算で切り詰められても、バッファからは NULL で終端した結果が確実に得られます。
すべての関数は HRESULT 値を返します。成功コード (S_OK) は 1 つだけです。
各関数は、対応する文字数 ("cch") またはバイト数 ("cb") バージョンで使用できます。
ほとんどの関数には、高度な機能に使用できる拡張 ("Ex") バージョンがあります。
詳細については、以下のセクションを参照してください。
文字数関数
次の関数は、バイト数ではなく文字数を使用します。
機能 | 置き換えます |
---|---|
, | |
バイトカウント関数
次の関数は、文字数ではなくバイト数を使用します。
機能 | 置き換えます |
---|---|
Strsafe.h の使用
Strsafe 関数をインラインで使用するには、他のすべてのヘッダー ファイルの #include ステートメントに従って、次に示すようにヘッダー ファイルを含めます。
#include <strsafe.h>
ライブラリ形式で関数を使用するには、Strsafe.h を含める前に次のステートメントを含めます。 ただし、インライン関数を使用することをお勧めします。
#define STRSAFE_LIB
Note
: 次の関数をインライン関数として使用する必要があります。 StringCbGets、 StringCbGetsEx、 StringCchGets、および 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
Note
STRSAFE_NO_CB_FUNCTIONSまたはSTRSAFE_NO_CCH_FUNCTIONSを定義できますが、両方を定義することはできません。
一部の Strsafe 関数には、ロケールに対応するバージョンがあります。 既定では、ヘッダーはこれらの関数を宣言しません。 これらの宣言を有効にするには、Strsafe.h を含める前に次のマクロ ステートメントを含めます。
#define STRSAFE_LOCALE_FUNCTIONS
サポートされる文字列の最大長は、ANSI または Unicode の 2,147,483,647 (STRSAFE_MAX_CCH) 文字です。
関連トピック