GetPrivateProfileString

 この関数は、第 1 引数(lpAppName)、第 2 引数(lpKeyName)に NULL 以外を指定した場合、文字列を取得するためにはバッファサイズが2文字分多く必要になる。
 1 文字は NULL 文字、もう 1 文字はなぜが必要になる。
 メモリをトレースしてみましたが、NULL 文字の次は書き換わっていませんでした。
 第 1 引数もしくは第 2 引数へ NULL を渡した場合の処理に起因しているのだろうか……
 (VS2015 debug 版で確認)
testPPF.ini
[App]
Key=Def
main.cpp
void test( int nStreamLength, _TCHAR const* const lpszFile )
{
TCHAR szStream[16];
memset( szStream, '*', sizeof(szStream) );
// GetPrivateProfileString が呼ばれる事でエラーコードが書き換わる事を
// 確認するために適当な値を設定しておく。
//
// 6 = ERROR_INVALID_HANDLE
::SetLastError( ERROR_INVALID_HANDLE );
DWORD nResult = ::GetPrivateProfileString(
TEXT("App"), TEXT("Key"),  TEXT("Def"),
szStream, nStreamLength, lpszFile );
// 2 = ERROR_FILE_NOT_FOUND
// 234 = ERROR_MORE_DATA
DWORD nError = ::GetLastError();
LPCTSTR lpszResult =
(nResult == nStreamLength - 1 ? _T("バッファ不足。") : _T(""));
Log( _T("終了: GetLastError=%3u: Result=%u, バッファサイズ=%d, \"%*s\", %s"),
nError, nResult, nStreamLength, nResult, szStream, lpszResult );
}
int _tmain()
{
_tsetlocale( LC_ALL, _T("Japanese") );
Log( _T("存在する .INI ファイル指定する") );
test( 3, TEXT(".\\testPPF.ini") );
test( 4, TEXT(".\\testPPF.ini") );
test( 5, TEXT(".\\testPPF.ini") );
Log( _T("") );
Log( _T("存在しない .INI ファイルを指定する") );
test( 3, TEXT(".\\testPPF_.ini") );
test( 4, TEXT(".\\testPPF_.ini") );
test( 5, TEXT(".\\testPPF_.ini") );
Log( _T("") );
Log( _T("以上の結果から、") );
Log( _T("GetPrivateProfileString 関数に渡すバッファ数は、") );
Log( _T("取得したい文字列の文字数 + NULL 文字 1 つと余分な 1 文字です。") );
Log( _T("") );
Log( _T("エラーは GetLastError 関数を呼び出して特定するのがベスト。") );
Log( _T(" 2 = ERROR_FILE_NOT_FOUND") );
Log( _T(" 234 = ERROR_MORE_DATA") );
return 0;
}
結果
存在する .INI ファイル指定する
終了: GetLastError= 234: Result=2, バッファサイズ=3, "De", バッファ不足。
終了: GetLastError= 234: Result=3, バッファサイズ=4, "Def", バッファ不足。
終了: GetLastError=   0: Result=3, バッファサイズ=5, "Def",
 
存在しない .INI ファイル指定する
終了: GetLastError=   2: Result=2, バッファサイズ=3, "De", バッファ不足。
終了: GetLastError=   2: Result=3, バッファサイズ=4, "Def", バッファ不足。
終了: GetLastError=   2: Result=3, バッファサイズ=5, "Def",
以上の結果から、
GetPrivateProfileString 関数に渡すバッファ数は、
取得したい文字列の文字数 + NULL 文字 1 つと余分な 1 文字です。
エラーは GetLastError 関数を呼び出して特定するのがベスト。
  2 = ERROR_FILE_NOT_FOUND
234 = ERROR_MORE_DATA