strsafe.hの使い方

マイクロソフトの開発環境に目新しいのって言ったらstrsafe.hの存在が挙げられる。で、ちょっとしたサンプルプログラムを書いてみたかったので書いてみた。MSDNにもあんまりサンプルが載っていないのでちょっとあんまり使い方がわかんないので少し困る。やっぱり新しい関数ほど丁寧に説明しなければならないのに、と感じました。

StringCchCat()

/*
	strsafe.hの使い方の練習
	StringCchCat()
	2005/May/18
*/

#define	STRICT
#include <windows.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* using strsafe */
#define STRSAFE_LIB
#include <strsafe.h>

/*
HRESULT StringCchCat(
    LPTSTR pszDest,
    size_t cchDest, // strlen(pszDest) + strlen(pszSrc) + 1 ???
    LPCTSTR pszSrc
);
*/

#define MAXLENGTH 1024

int main(void)
{
	HRESULT result;
	LPTSTR str1 = TEXT("こんにちは");
	LPTSTR str2 = TEXT("ぼくドラえもん");
	LPTSTR dst = malloc(sizeof(TCHAR) * MAXLENGTH);
	
	// StringCchCatは文字列の末尾につけるので終端文字が必要
	// malloc()で確保されているので文字列の規格に沿うようにさせる
	dst[0] = '\0';
	
	// 第二引数にはSTRSAFE_MAX_CCHなど入れてはいけないんだが
	// めんどくさいので放り込む
	result = StringCchCat(dst, STRSAFE_MAX_CCH, str1);
	result = StringCchCat(dst, STRSAFE_MAX_CCH, str2);
	
	printf("STRSAFE_MAX_CCH = %d\n", STRSAFE_MAX_CCH);
	puts(dst);
	
	// StringCchCatの返り値チェック
	switch (result) {
		case S_OK:
			puts("S_OK");
			break;
		case STRSAFE_E_INVALID_PARAMETER:
			puts("STRSAFE_E_INVALID_PARAMETER");
			break;
		case STRSAFE_E_INSUFFICIENT_BUFFER:
			puts("STRSAFE_E_INSUFFICIENT_BUFFER");
			break;
	}
	
	exit(EXIT_SUCCESS);
}