Здесь:
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
< em>символьный литерал вместо архаичного сопоставления данных и текста, которые зависят от того, определена ли в вашей программе константа _UNICODE
или _MBCS
. И наоборот, лучше использовать широкоформатные версии всех вызовов API и языковых библиотек, например wprintf()
вместо printf()
.
person
Geezer
schedule
25.09.2018
CStringW
вместоCString
, замените_T
и подобные макросы префиксомL
и живите долго и счастливо. Другими словами:CStringW totalSpace; totalSpace.Format(L"%I64d", i64TotalGB); wprintf(L"totalSpace contains: %s", totalSpace.GetString());
. - person IInspectable   schedule 25.09.2018