Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141

Перевод полученных данных через WMI в понятное представление

12.04.2018, 11:00. Показов 2710. Ответов 15
Метки wmi (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, допустим у меня есть код который получает информацию о процессоре (или о чем ни будь другом в системе), но некоторые значения которые возвращает запрос WMI для рядового пользователя не понятен, к примеру
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ManagementObjectSearcher CPUser = new ManagementObjectSearcher("SELECT * From Win32_Processor");
            foreach (ManagementObject myCPU in CPUser.Get())
            {
                Lbl_cpu_arhit.Content = myCPU["Architecture"].ToString();
                Lbl_cpu_caption.Content = myCPU["Caption"].ToString();
                Lbl_cpu_family.Content = myCPU["Family"].ToString();
                Lbl_cpu_l2.Content = myCPU["L2CacheSize"].ToString();
                Lbl_cpu_l3.Content = myCPU["L3CacheSize"].ToString();
                Lbl_cpu_manufactured.Content = myCPU["Manufacturer"].ToString();
                Lbl_cpu_name.Content = myCPU["Name"].ToString();
                Lbl_cpu_numbcores.Content = myCPU["NumberOfCores"].ToString();
                Lbl_cpu_procID.Content = myCPU["ProcessorID"].ToString();
                Lbl_cpu_revision.Content = myCPU["Revision"].ToString();
            }
строка lbl_cpu_arch получает сведения об архитектуре процессора, но выводит вместо х64 цифру 9. Или цифру 0, рядовой пользователь не поймет что это x86. Так вот в чем вопрос господа знатоки, как мне заменить эти цифры в выше приведенном коде на нормальное представление. Непосредственно я понимаю что необходимо использовать логику if else и использовать переменные var
C#
1
2
3
4
5
6
7
8
9
10
11
{
                var cpuarch9 = "x 64 Bit";
 
                if ()
                {
                    Lbl_cpu_arhit.Content = cpuarch9;
                }
 
                Lbl_cpu_arhit.Content = myCPU["Architecture"].ToString();
                Lbl_cpu_caption.Content = myCPU["Caption"].ToString();
                Lbl_c.....
но вот как правильно указать проверочное выражение для if не пойму, как именно зацепиться
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.04.2018, 11:00
Ответы с готовыми решениями:

Разбор данных полученных через компорт 232
Доброй ночи!!! Помогите пожалуйста с расшифровкой инфы с ком порта см. прикрепленную пикчу Буду очень рад Вашим ответам по теме :)

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

[C#+WMI]Можно ли через WMI узнать температуру процессора и ядер?
Можно ли через WMI узнать температуру процессора и ядер? Щас лопачу сайты вожусь но русскоязычной документации по WMI нету :( А тем...

15
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
13.04.2018, 11:53
Лучший ответ Сообщение было отмечено Konradvall как решение

Решение

Цитата Сообщение от Konradvall Посмотреть сообщение
как именно зацепиться
C#
1
Lbl_cpu_arhit.Content = (ushort)myCPU["Architecture"] == 9 ? "x 64 Bit" : "x 32 Bit";
Добавлено через 12 минут
Или так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
Lbl_cpu_arhit.Content = ((CPUArchitecture)(ushort)myCPU["Architecture"]).ToString();
 
   public enum CPUArchitecture
   {
      x86 = 0,
      MIPS = 1,
      Alpha = 2,
      PowerPC = 3,
      ARM = 5,
      Itanium = 6,
      x64 = 9
   }
Добавлено через 20 часов 47 минут
Цитата Сообщение от Konradvall
привет просвети меня еще по такому поводу, мне необходимо заменить (к примеру 16) на текст с пробелами(к примеру Pentium II Xeon) как мне это правильно реализовать, дело в то что при попытке заменить лвое значение на текст с пробелами он мне выдает отчет об ошибках и не дает запустить логику:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 public enum CPUFamily
        {
            
            Other = 1,
            Unknown = 2,
            Intel386 = 5,
            Intel486 = 6,
            Pentium_Brand = 11,
            Pentium_Pro = 12,
            Pentium_II = 13,
            Pentium_ MMX = 14,
            Celeron = 15,
            Pentium II Xeon = 16,
            Pentium_III = 17,
            M1 = 18,
            M....
и мне приходиться ставить нижние подчеркивание для работы кода, что естественно не приемлемо.

Можно сделать так (пример для CPUArchitecture):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System.Collections.Generic;
using System.Management;
 
namespace Temp
{
   class Program
   {
      static void Main(string[] args)
      {
         ManagementObjectSearcher CPUser = new ManagementObjectSearcher("SELECT * From Win32_Processor");
         foreach(ManagementObject myCPU in CPUser.Get())
         {
            string str = ((CPUArchitecture)(ushort)myCPU["Architecture"]).Print();
         }
      }
   }
 
   public enum CPUArchitecture
   {
      x86 = 0,
      MIPS = 1,
      Alpha = 2,
      PowerPC = 3,
      ARM = 5,
      Itanium = 6,
      x64 = 9
   }
 
   public static class CPUArchitectureHelper
   {
      private static readonly Dictionary<CPUArchitecture, string> dic = new Dictionary<CPUArchitecture, string>
      {
         [CPUArchitecture.x86] = "x 32 Bit",
         [CPUArchitecture.x64] = "x 64 Bit",
         [CPUArchitecture.Alpha] = "Alpha",
         [CPUArchitecture.ARM] = "ARM",
         [CPUArchitecture.Itanium] = "Itanium-based systems",
         [CPUArchitecture.PowerPC] = "Power PC",
         [CPUArchitecture.MIPS] = "MIPS"
      };
 
      public static string Print(this CPUArchitecture self)
      {
         return dic[self];
      }
   }
}
1
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
16.04.2018, 05:08  [ТС]
Fleder, пробовал сделать как ты предложил, не срабатывает логика, в нескольких пунктах:
1.
C#
1
2
3
4
public static string Print(this CPUArchitecture self)
      {
         return dic[self];
      }
CS1109 Методы расширения должны быть определены в статическом классе верхнего уровня; CPUArchitectureHelper является вложенным классом.

2. мне необходимо все это дело выводить в label, но у меня не получается перестроить логику под данные нужды.
пни в правильном направлении
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 13:20
Цитата Сообщение от Konradvall Посмотреть сообщение
CS1109 Методы расширения должны быть определены в статическом классе верхнего уровня; CPUArchitectureHelper является вложенным классом.
Эта ошибка как бы сама за себя говорит: статические классы с методами расширения (назовём их хелперами) не должны находиться
внутри других классов. Они должны находиться непосредственно в пространстве имён, так скажем.

Создайте в своём проекте отдельный файл для каждого хелпера, это будет лучшей практикой.
Один тип - один файл. Я даже для малюсенького перечисления создаю отдельный файл.

Потом смотришь в солюшен эксплорере на эти файлы и понимаешь, сколько у тебя типов
и где каждый их них. Не экономьте на файлах!

Цитата Сообщение от Konradvall Посмотреть сообщение
мне необходимо все это дело выводить в label, но у меня не получается перестроить логику под данные нужды.
пни в правильном направлении
Ну, вы приведите пример своего кода. А то в слепую-то сильно не насоветую.
0
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
16.04.2018, 13:37  [ТС]
Fleder, я правильно вас понял что мне необходимо создать для каждого хелпера отдельный класс и поместить в него логику перечисления по enum's и логику которую вы предложили, а в основном коде сделать ссылку на данный класc

Добавлено через 10 минут
Fleder,CS1061 'ushort" не содержит определения для "Print" и не удалось найти метод расширения "Print", принимающий тип "ushort" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 13:38
Цитата Сообщение от Konradvall Посмотреть сообщение
необходимо создать для каждого хелпера отдельный класс и поместить в него логику перечисления по enum's и логику которую вы предложили
Да. В отдельный файл помещаете, например, статический класс CPUArchitectureHelper, который содержит
в себе приватный словарь и метод Print.

В другой отдельный файл помещаете перечисление CPUArchitecture и больше ничего.

Если в этих двух файлах (CPUArchitectureHelper и CPUArchitecture)
используется то же самое пространство имён, что и в том коде, где вы их используете,
то они подхватятся автоматически.
Если же у этих файлов будет другое пространство имён, то его необходимо подключить в использующем коде с помощью using.
0
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
16.04.2018, 13:39  [ТС]
это уже в созданном классе

Добавлено через 1 минуту
Fleder, как правильно подключить через директиву using
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 13:45
Цитата Сообщение от Konradvall Посмотреть сообщение
CS1061 'ushort" не содержит определения для "Print" и не удалось найти метод расширения "Print", принимающий тип "ushort" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
Внимательнее со скобочками:
C#
1
Lbl_cpu_arhit.Content = ((CPUArchitecture)(ushort)myCPU["Architecture"]).Print();
Цитата Сообщение от Konradvall Посмотреть сообщение
как правильно подключить через директиву using
C#
1
using MyNamespace;
Добавлено через 3 минуты
Цитата Сообщение от Konradvall Посмотреть сообщение
а в основном коде сделать ссылку на данный класc
Ссылку на данный класс делать не нужно.
Он и так будет виден.
Вот чем хорош проект на C# - насоздавали кучу файлов в одном пространстве имён, а в проекте они видны сразу все.
В C++ нужно было в начало файла включать хедеры.
0
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
16.04.2018, 13:50  [ТС]
Fleder, подробнее про Print расскажите, дело в то м что он все равно выдает ту же ошибку
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 13:53
Цитата Сообщение от Konradvall Посмотреть сообщение
подробнее про Print расскажите, дело в то м что он все равно выдает ту же ошибку
Я же не вижу структуру вашего проекта.
Если он не такой секретный, можете прицепить во вложения.
0
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
16.04.2018, 13:58  [ТС]
не секретный
Вложения
Тип файла: rar WPFTest1.rar (1.48 Мб, 7 просмотров)
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
16.04.2018, 14:11
Лучший ответ Сообщение было отмечено Konradvall как решение

Решение

Konradvall, вот ваш проект с исправлениями. У меня он запустился.
Посмотрите, как должны выглядеть файлы CPUArchit.cs и CPUArchitHelper.cs
И по аналогии создавайте хелперы и перечисления для других данных.
Каждый в отдельном файлике.
Вложения
Тип файла: 7z WPFTest_fixed.7z (897.4 Кб, 3 просмотров)
1
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
05.06.2018, 14:13
Цитата Сообщение от Konradvall
Привет ты помог мне с классами enum и helper недавно, у меня такой вопрос, все делаю как положенно но иногда выскакивают такого рода исключения, к примеру
C#
1
LblosSupportPolicy.Content =((OSSupPolInformation)(ushort) myOS["DataExecutionPrevention_SupportPolicy"]).OSSupPolPrint();
исключение System.InvalidCastException: "Заданное приведение является недопустимым."
При индексировании объекта ManagementObject возвращается тип object.
Чтобы привести этот тип к типу перечисления необходимо сначала привести тип object к его настоящему типу.
Именно на этом приведении типа и возникает System.InvalidCastException.

Вот класс Win32_OperatingSystem:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
[Singleton, Dynamic, Provider("CIMWin32"), SupportsUpdate, UUID("{8502C4DE-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
class Win32_OperatingSystem : CIM_OperatingSystem
{
  string   BootDevice;
  string   BuildNumber;
  string   BuildType;
  string   Caption;
  string   CodeSet;
  string   CountryCode;
  string   CreationClassName;
  string   CSCreationClassName;
  string   CSDVersion;
  string   CSName;
  sint16   CurrentTimeZone;
  boolean  DataExecutionPrevention_Available;
  boolean  DataExecutionPrevention_32BitApplications;
  boolean  DataExecutionPrevention_Drivers;
  uint8    DataExecutionPrevention_SupportPolicy;
  boolean  Debug;
  string   Description;
  boolean  Distributed;
  uint32   EncryptionLevel;
  uint8    ForegroundApplicationBoost = 2;
  uint64   FreePhysicalMemory;
  uint64   FreeSpaceInPagingFiles;
  uint64   FreeVirtualMemory;
  datetime InstallDate;
  uint32   LargeSystemCache;
  datetime LastBootUpTime;
  datetime LocalDateTime;
  string   Locale;
  string   Manufacturer;
  uint32   MaxNumberOfProcesses;
  uint64   MaxProcessMemorySize;
  string   MUILanguages[];
  string   Name;
  uint32   NumberOfLicensedUsers;
  uint32   NumberOfProcesses;
  uint32   NumberOfUsers;
  uint32   OperatingSystemSKU;
  string   Organization;
  string   OSArchitecture;
  uint32   OSLanguage;
  uint32   OSProductSuite;
  uint16   OSType;
  string   OtherTypeDescription;
  Boolean  PAEEnabled;
  string   PlusProductID;
  string   PlusVersionNumber;
  boolean  PortableOperatingSystem;
  boolean  Primary;
  uint32   ProductType;
  string   RegisteredUser;
  string   SerialNumber;
  uint16   ServicePackMajorVersion;
  uint16   ServicePackMinorVersion;
  uint64   SizeStoredInPagingFiles;
  string   Status;
  uint32   SuiteMask;
  string   SystemDevice;
  string   SystemDirectory;
  string   SystemDrive;
  uint64   TotalSwapSpaceSize;
  uint64   TotalVirtualMemorySize;
  uint64   TotalVisibleMemorySize;
  string   Version;
  string   WindowsDirectory;
  uint8    QuantumLength;
  uint8    QuantumType;
};
Поле DataExecutionPrevention_SupportPolicy имеет тип uint8.
Этот тип в C# будет соответствовать типу byte, поэтому надо так:
C#
1
LblosSupportPolicy.Content =((OSSupPolInformation)(byte)myOS["DataExecutionPrevention_SupportPolicy"]).OSSupPolPrint();
0
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
13.06.2018, 06:55  [ТС]
Fleder, а как насчет параметра string? может проще скинешь мне ссылку на документацию, а то дергать тебя уже неудобно, да и мне полезнее будет.

Добавлено через 6 минут
к примеру такой вариант: Lbloscontrycode.Content = ((OSCountryCodeInformation)(????) myOS["CountryCode"]).OSCounCodePrint();
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
13.06.2018, 13:43
Цитата Сообщение от Konradvall Посмотреть сообщение
а как насчет параметра string?
Здесь можно включить логическое мышление и подумать, во что же может смаршалиться неуправляемая
строка в C#? Может быть в тип String? Нет?

Цитата Сообщение от Konradvall Посмотреть сообщение
может проще скинешь мне ссылку на документацию, а то дергать тебя уже неудобно, да и мне полезнее будет.
Не совсем понимаю, про какую документацию речь...
Если про описание самих Win32 классов, то можно посмотреть тут.

Цитата Сообщение от Konradvall Посмотреть сообщение
к примеру такой вариант: Lbloscontrycode.Content = ((OSCountryCodeInformation)(????) myOS["CountryCode"]).OSCounCodePrint();
Чтобы наверняка узнать тип можно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Management;
 
namespace Temp
{
   class Program
   {
      static void Main(string[] args)
      {
         ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * From Win32_OperatingSystem");
         foreach(ManagementObject obj in searcher.Get())
         {
            //Объявляем переменную, тип которой мы точно не знаем, как object
            //и смотрим в отладчике её настоящий тип.
            object value = obj["CountryCode"];
         }
      }
   }
}
0
2 / 2 / 0
Регистрация: 30.01.2018
Сообщений: 141
14.06.2018, 03:59  [ТС]
Fleder, спасибо разобрался)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2018, 03:59
Помогаю со студенческими работами здесь

Искажение данных, полученных через сеть
Не знаю, там ли я создал тему, но... Есть один ноут ASUS X75VC, на котором данные (в основном больших объемов), получаемые через сеть...

Вывод данных полученных через Bluetooth на экран
Есть датчик dht22 с него приходят 2 показателя: Температура и влажность,требуется получить данные по блютус на смартфон и вывести на экран....

Вывод всех данных полученных через POST
Добрый вечер! Нужно вывести все данные полученные через POST запрос, но при этом нам не известно количество этих данных. После, нам...

Представление заданных типов данных в двоичном виде и перевод из двоичного представления
При выполнении лабораторной работы в университете обнаружил пробел в понимании типа unsigned char, то,как им пользоваться(в частности в...

Представление данных через datagridview
Привет всем! У меня вопрос чисто по возможности следующего: есть какая-то база данных n, мы подключены к ней и весело перекачиваем все...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru