Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
1

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

26.09.2012, 01:16. Просмотров 1701. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2012, 01:16
Ответы с готовыми решениями:

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

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

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

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

Как поделить число и вывести его на экран?
как поделить число и вывести его на экран (fasm),написал код но не получается программа выдает...

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

C++
1
MessageBox::Show("Размер диска= " + Convert::ToString(vtProp.uintVal);
Здесь Вы выводите только младшее двойное слово.
0
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
26.09.2012, 20:43  [ТС] 3
Сделал вот так,всё равно не работает:
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/20120926/h7uQRUSp.png
0
AlexSpl
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
27.09.2012, 13:31 4
Почему бы вместо VARIANT не использовать System::Int64?

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

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

http://msdn.microsoft.com/en-us/libr...(v=vs.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
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
27.09.2012, 18:56  [ТС] 7
Оба варианта не работают.Т.е. работают но выдают чушь вместо размера.
Вот прилагаю исходники,можете сами попробовать: (сделаны на VS2008 ,но должны работать везде)
0
Вложения
Тип файла: rar HappyBloodPiglet.rar (731.3 Кб, 11 просмотров)
AlexSpl
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
27.09.2012, 19:51 8
Нужно так:
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
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
27.09.2012, 20:31  [ТС] 9
Да,чего то я в самом деле идиот) Я вроде первый раз так и делал,но не работало.А сейчас работает
Меня ещё сбило с толку,что в примерах на 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/20120927/7JVvKE1e.png
0
AlexSpl
2 / 2 / 0
Регистрация: 18.09.2012
Сообщений: 26
28.09.2012, 12:22 10
Рекомендую проверить, какой именно размер диска получает функция 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
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
28.09.2012, 13:43  [ТС] 11
Вообще я хочу не в int выводить ,а вот так: "467,35 ГБ" . Т.е. это будет вещественное число с плавающей точкой и 2-мя знаками после запятой.
У меня будет выдаваться размер физического диска и суммироваться размер всех его партиций,и всё это сравнивать - типа,нет ли где неразмеченного пространства.
А ещё есть интересный глюк с параметров TotalCylinders - он у меня выводится правильно только для 2 винчестеров из 6. Видимо,что-то накосячили с драйверами или WMI

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

Добавлено через 1 минуту
Только некоторые параметры поддерживаются начиная с Vista и выше.Поэтому надо смотреть описание в MSDN.
0
28.09.2012, 13:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2012, 13:43

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru