Здесь:
totalSpace.Format(_T("%I64d", i64TotalGB));
вы передаете i64TotalGB
в качестве аргумента макросу _T()
вместо того, чтобы передать его в качестве второго аргумента Format()
.
Попробуйте это:
totalSpace.Format(_T("%I64d"), i64TotalGB);
Сказав, что благодаря беспорядку (ха) MS вокруг кодировки символов, использование _T
здесь не является правильным, так как CString
состоит изTCHAR
, а не _TCHAR
.Таким образом, принимая это во внимание, можно также использовать TEXT()
вместо T()
, поскольку оно зависит от UNICODE
, а не _UNICODE
:
totalSpace.Format(TEXT("%I64d"), i64TotalGB);
Кроме того, эта строка неверна какон пытается передать ATL CString
как char*
(он же строка в стиле C ):
printf("totalSpace contains: %s", totalSpace);
, для которого компилятор выдает это предупреждение:
warning C4477: 'printf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'ATL::CString'
Хотя структура CString
практически совместима с ее передачей, как у вас, формально это все равно неопределенное поведение .Используйте CString::GetString()
для защиты от него:
printf("totalSpace contains: %ls", totalSpace.GetString());
Обратите внимание на %ls
, как в моей конфигурации totalSpace.GetString()
вернул const wchar_t*
.Однако, поскольку "printf
в настоящее время не поддерживает вывод в поток UNICODE. " , правильная версия для этой строки, которая будет поддерживать символы вне вашей текущей кодовой страницы , это вызов wprintf()
следующим образом:
wprintf("totalSpace contains: %s", totalSpace.GetString());
Сказав ВСЁ, вот общий совет, независимо от прямой проблемы, стоящей за вопросом.Гораздо лучшая практика в наше время немного отличается, и я цитирую респектабельный ответ @IInspectable, в котором говорится, что «отображения общего текста были актуальны 2 десятилетия назад» .
Какая альтернатива?При отсутствии достаточных причин попробуйте явно придерживаться CStringW
( Строка символьного типа Unicode с поддержкой CRT ).Предпочитайте L
символьный литерал над архаичным отображением данных / текста , чтобы зависело от того, была ли константа _UNICODE
или _MBCS
определено в вашей программе .И наоборот, лучшей практикой будет использование широкосимвольных версий всех вызовов API и языковых библиотек, таких как wprintf()
вместо printf()
.