Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57

Как преобразовать большое число int64 в VARIANT чтобы затем его вывести на экран

26.09.2012, 01:16. Показов 3381. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Работаю с WMI,получаю размер диска. Тип данных int64 (согласно докам MSDN), после операции Get получаем переменную vtProp типа VARIANT, чтобы вывести значение на экран надо делать примерно так:
MessageBox::Show("Размер диска= " + Convert::ToString(vtProp.uintVal);
При этом информация о размере выдается неверная.Тоже самое с vtProp.ulVal
(int64 это насколько я понял unsigned long)

Добавлено через 1 минуту
Для небольших значений (int16 и int32) этот способ работает. А когда большие числа, получается размер в байтах например 40 ГБ это 40*10^9 цифр надо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2012, 01:16
Ответы с готовыми решениями:

Как вывести большое число на экран
Как вывести 30 значное число на экран, есть пример 987654321987654*123456789123456=в итоге получается 30 значное число, и я не знаю как его...

Как преобразовать большое число в строку
Делаю такое преобраование char szbuff; double X=3292373930; sprintf(szbuff, "%g", X); string X_str=szbuff; В результате...

Из 12 положительных чисел, найти самое большое число и вывести его порядковый номер
Входной файл: input.txt Выходной файл: output.txt Женя купила 12 яблок и по приходу домой решила узнать массу каждого яблока....

10
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
26.09.2012, 14:05
__int64 - это signed long long. Размер дисков/файлов обычно возвращается значением типа ULONGLONG (unsigned long long).

C++
1
MessageBox::Show("Размер диска= " + Convert::ToString(vtProp.uintVal);
Здесь Вы выводите только младшее двойное слово.
0
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
26.09.2012, 20:43  [ТС]
Сделал вот так,всё равно не работает:
C++
1
2
3
4
hr=pclsObj->Get(L"Size",0,&vtProp,0,0);
        signed long long hdsize=(vtProp.ullVal)/1024;
        String^ hdpart = Convert::ToString(hdsize);
        textBox1->AppendText(" "+hdpart+Environment::NewLine);
http://s1.ipicture.ru/uploads/... uQRUSp.png
0
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
27.09.2012, 13:31
Почему бы вместо VARIANT не использовать System::Int64?

C++
1
2
3
System::Int64 hdsize;
...
textBox1->AppendText(" " + hdsize.ToString() + Environment::NewLine);
0
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
27.09.2012, 13:38  [ТС]
Моя проблема описана тут:
http://www.experts-exchange.co... 51623.html
The values are uint64 type, but impossible to retrieve them into the VARIANT struct.
Только там нет ответов
0
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
27.09.2012, 14:23
Почитал о VARIANT и IWbemClassObject::Get:

http://msdn.microsoft.com/en-u... s.85).aspx

http://msdn.microsoft.com/en-u... s.85).aspx

Действительно, System::Int64 не прокатит. Может быть, возвращается не размер, а указатель на него:

C++
1
ULONGLONG           *pullVal;
Добавлено через 21 минуту
Если функция всё-таки возвращает размер диска как unsigned long long, то должен работать следующий код:
C++
1
2
3
hr = pclsObj->Get(L"Size", 0, &vtProp, 0, 0);
unsigned long long hdSize = vtProp.ullVal >> 10;
textBox1->AppendText(" " + hdSize.ToString() + Environment::NewLine);
Если как указатель:
C++
1
2
3
hr = pclsObj->Get(L"Size", 0, &vtProp, 0, 0);
unsigned long long hdSize = *(vtProp.pullVal) >> 10;
textBox1->AppendText(" " + hdSize.ToString() + Environment::NewLine);
0
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
27.09.2012, 18:56  [ТС]
Оба варианта не работают.Т.е. работают но выдают чушь вместо размера.
Вот прилагаю исходники,можете сами попробовать: (сделаны на VS2008 ,но должны работать везде)
Вложения
Тип файла: rar HappyBloodPiglet.rar (731.3 Кб, 11 просмотров)
0
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
27.09.2012, 19:51
Нужно так:
C++
1
2
3
hr = pclsObj->Get(L"Size", 0, &vtProp, 0, 0);
String^ hdSize = Marshal::PtrToStringBSTR(static_cast<IntPtr>(vtProp.bstrVal));
textBox1->AppendText(" " + hdSize + Environment::NewLine);
1
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
27.09.2012, 20:31  [ТС]
Да,чего то я в самом деле идиот) Я вроде первый раз так и делал,но не работало.А сейчас работает
Меня ещё сбило с толку,что в примерах на VB размер выводится как vtProp.uintVal

А как теперь сделать,чтобы размер выводился в Гигабайтах? Преобразовать String в double, а потом наоборот в строку?

Добавлено через 22 минуты
Вот такие извращения получились:
C++
1
2
3
4
5
6
hr=pclsObj->Get(L"Size",0,&vtProp,0,0);
        String^ hdsize = Marshal::PtrToStringBSTR(static_cast<IntPtr>(vtProp.bstrVal));
        double hdsize1=Convert::ToDouble(hdsize);
        hdsize1=Convert::ToInt64(hdsize1/1024/1024);
        String^ hdpart = System::Convert::ToString(hdsize1);
        textBox1->AppendText("   "+hdpart+"   МБ"+Environment::NewLine);
http://s1.ipicture.ru/uploads/... VvKE1e.png
0
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
28.09.2012, 12:22
Рекомендую проверить, какой именно размер диска получает функция Get c параметром "Size". Нужно читать документацию. В Windows (по правому клику) отображается несколько больший размер диска. Возможно, возвращается полный размер неформатированного диска.

C++
1
2
double hdsize1=Convert::ToDouble(hdsize);
hdsize1=Convert::ToInt64(hdsize1/1024/1024);
Строку можно сразу конвертировать в Int64, а деление на степень двойки рекомендую заменить на битовый сдвиг вправо:
C++
1
hdsize1 >> 20;
Здесь hdsize1 сдвигается на 20 битов вправо, что соответствует делению на 2^20 = 2^10 * 2^10 = 1024 * 1024.

Добавлено через 14 минут
Можно так переводить в мегабайты:
C++
1
2
3
4
hr = pclsObj->Get(L"Size", 0, &vtProp, 0, 0);
String^ hdSize = Marshal::PtrToStringBSTR(static_cast<IntPtr>(vtProp.bstrVal));
UInt64 hdSizeInMB(UInt64::Parse(hdSize) >> 20);
textBox1->AppendText(" " + hdSizeInMB + Environment::NewLine);
Также стоит уточнить, какой тип возвращается: Int64 или UInt64.

Ещё учтите, что производители используют метрические систему для размера диска, т.е. 500 GB = 500 * 10^9 = 500 * 1000 * 1000 * 1000 байт, а не 500 * 1024 * 1024 * 1024 байт.

Так что диск на 500 GB, на самом деле, на 465
0
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
28.09.2012, 13:43  [ТС]
Вообще я хочу не в int выводить ,а вот так: "467,35 ГБ" . Т.е. это будет вещественное число с плавающей точкой и 2-мя знаками после запятой.
У меня будет выдаваться размер физического диска и суммироваться размер всех его партиций,и всё это сравнивать - типа,нет ли где неразмеченного пространства.
А ещё есть интересный глюк с параметров TotalCylinders - он у меня выводится правильно только для 2 винчестеров из 6. Видимо,что-то накосячили с драйверами или WMI

Добавлено через 5 минут
Для тех новичков,кто будет разбираться с WMI могу сказать что исходник который я выложил можно использовать для получения информации об абсолютно любом устройстве в системе.
Меняется только класс,например Win32_Printer и название параметра,например Caption или FreeSpace. Т.е. структуру WMI можно использовать вообще везде и ничего не выдумать нового

Добавлено через 1 минуту
Только некоторые параметры поддерживаются начиная с Vista и выше.Поэтому надо смотреть описание в MSDN.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2012, 13:43
Помогаю со студенческими работами здесь

Ввести массив символов, а затем вывести его на экран
народ помогите пожалуйстаю напишите пожалуйста небольшой кусочек кода: необходимо ввести массив символов, а затем вывести его на...

Как поделить число и вывести его на экран?
как поделить число и вывести его на экран (fasm),написал код но не получается программа выдает ошибку ;lab_1 var 12/ex_2 format PE...

Как преобразовать большое число в строку через stringstream и ограничить знаки после точки
опять возникла проблема которая была недавно но с другим методом нужно преобразовать большое число типо double в строку через...

Дано двузначное число. Вывести вначале его левую цифру (десятки), а затем - его правую цифру (единицы)
Дано двузначное число. Вывести вначале его левую цифру (десятки), а затем - его правую цифру (единицы). Для нахождения десятков...

Дано трехзначное число. Вывести вначале его последнюю цифру (единицы), а затем — его среднюю цифру (десятки).
Помогите пожалуйста с задачей. Дано трехзначное число. Вывести вначале его последнюю цифру (единицы), а затем — его среднюю цифру...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru