Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 17

¨  Если задать Action без параметра шаблона, то это будет соответствовать сигнатуре void ЛюбоеИмяФункции().

Теперь вы спокойно можете отлаживать 2-поточное приложение. Проверьте: удалите папку Data, поставьте точки останова в тело AddItem, затем нажмите F5, дождитесь останова и выполните несколько операторов в пошаговом режиме (F10).

Если у вас нет точек останова, то нет смысла запускать приложение в режиме отладки. Смысл есть только тогда, когда вы ожидаете беду (malfunction). Некоторые студенты отвечают: "Я всегда ожидаю беду" (это разумно, но не всегда).

Если не работать в режиме отладки, то можно обойтись без вызова Invoke. Разработчики приложения WMICreator (ищите в Internet) именно так и поступают.

Реакции на события выбора в деревьях и списках

В данный момент наш элемент управления WMIControl должен с помощью элемента treeNS отображать дерево пространств имен WMI. Добейтесь, чтобы это было так. Для проверки алгоритмов работы с деревом удалите папку Data (если она существует), она должна быть вновь создана нашим кодом. Каждый второй и все последующие запуски приложения должны читать информацию о дереве из файла (не опрашивать базу данных WMI).

Теперь приступим к разработке реакции на выбор одного из пространств имен в дереве treeNS. Для каждого выбранного пользователем пространства имен (событие AfterSelect) мы собираемся получить множество классов, которое в нем обитает. Так как это множество может быть большим (тысячи классов), то неплохо бы разбить его на какие-то категории и отобразить в виде дерева. Для этой цели уже имеется элемент TreeView по имени treeClasses.

В теле обработчика события AfterSelect надо обратиться к базе данных WMI и указать в запросе:

¨  Выбранное пользователем имя пространства имен,

¨  Запрашиваемую сущность. Судя по документации, это "meta_class",

У каждого из найденных классов надо выявить значение свойства "__CLASS", которое является искомым именем класса WMI. Множество имен классов следует рассортировать на категории и поместить в дерево treeClasses. Учитывая сказанное, рассмотрите код реакции на событие AfterSelect в дереве treeNS.

void treeNS_AfterSelect(object sender, TreeViewEventArgs e)

{

ClearLists();

treeClasses.Nodes[0].Collapse();

treeClasses.Nodes[0].Nodes.Clear();

treeClasses.BeginUpdate();

lblNumClasses.Text = "Searching...";

treeNS.Enabled = treeClasses.Enabled = false;

string path = e.Node.FullPath; // Выбранное в дереве имя пространства имен

GetClasses(path);

treeNS.Enabled = treeClasses.Enabled = true;

lblNumClasses.Text = nClasses + " classes";

treeClasses.EndUpdate();

treeClasses.Nodes[0].Expand();

lblNamespace.Text = path;

}

void GetClasses(string ns)

{

FormSplash.ShowForm("Searching for WMI Classes... Please, wait");

try

{

ManagementObjectSearcher searcher = new ManagementObjectSearcher(

new ManagementScope(ns),

new SelectQuery("meta_class"), null);

foreach (ManagementClass c in searcher.Get())

{

string name = c["__CLASS"].ToString();

nClasses++;

AddClass(name, c);

FormSplash.AddItem(name);

}

}

catch (Exception e) { SetError(e.Message, ns); }

FormSplash.CloseForm();

}

Алгоритм запроса и обработки его результатов похож на тот, что был использован для пространств имен с той разницей, что результат имеет вид линейной коллекции, а не дерева. В методе AddClass мы попытаемся построить дерево классов путем разбиения полученной коллекции на категории. Отдельно выделяются классы, в свойстве Derivation которых имеется слово "__Event". Другую категорию образуют классы, в множестве описателей которых имеются значения "dynamic" или "static". В документации говорится, что такие классы имеют свойства. Позже вы увидите, что почти все классы имеют свойства, даже те, у которых нет указанных описателей.