WindowsのGetPrivateProfileXXX関数(INIファイルの操作に使用)には、バッファ長の処理に関するいくつかの奇妙な規則があります。GetPrivateProfileString - バッファの長さ
のGetPrivateProfileStringのドキュメントの状態:
[..]供給先バッファが要求された文字列を保持するには小さすぎる、文字列が切り捨てられ、ヌル文字が続いており、戻り値が等しい場合nSizeマイナス1。
私はこれを読んで、私は、この動作は、それが不可能で、コードの2つのシナリオを区別することができますことに気づい:値の文字列の長さがnsizeの場合と全く同じである場合には
- - 1.
- ときnSize値(すなわち、バッファ)が小さすぎる。
私が試したいと思った:
[Bar]
foo=123456
そして、私はテストとしてこれらの引数でのGetPrivateProfileStringと呼ばれる:私は、INIファイルでこれを持って
// Test 1. The buffer is big enough for the string (16 character buffer).
BYTE* buffer1 = (BYTE*)calloc(16, 2); // using 2-byte characters ("Unicode")
DWORD result1 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 16, fileName);
// result1 is 6
// buffer1 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0, 0, 0, ... , 0, 0 }
// Test 2. The buffer is exactly sufficient to hold the value and the trailing null (7 characters).
BYTE* buffer2 = (BYTE*)calloc(7, 2);
DWORD result2 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 7, fileName);
// result2 is 6. This is equal to 7-1.
// buffer2 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0 }
// Test 3. The buffer is insufficient to hold the value and the trailing null (6 characters).
BYTE* buffer3 = (BYTE*)calloc(6, 2);
DWORD result3 = GetPrivateProfileString(L"Bar", L"foo", NULL, buffer, 6, fileName);
// result3 is 5. This is equal to 6-1.
// buffer3 is { 49, 0, 50, 0, 51, 0, 52, 0, 53, 0, 0, 0 }
このコードを呼び出すプログラムは、実際のキー値が最後の2つのカスのように実際に5文字の長さであっても、6文字であっても確かに知る方法がありません結果はnSize - 1に等しくなります。
唯一の解決策は、結果== nSize - 1を確認し、より大きなバッファで関数を呼び出すことですが、バッファが正確に正しいサイズ。
良い方法はありませんか?
これはCまたはC++のコードですか? –