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

Процесс построения дерева пространств имен WMI занимает много времени и мы собираемся записать сгенерированную структуру дерева в XML-файле, имя которого будет храниться в переменной xmlFile. При повторном запуске приложения оно прочтет дерево из файла и сэкономит время.

Переменная curClass типа ManagementClass будет хранить ссылку на класс WMI, выбранный в данный момент пользователем. Выбор класса происходит в обработчике события AfterSelect объекта treeClasses. Напомню, что это дерево (объект типа TreeView) позволяет выбрать один из классов WMI.

Переменная xDoc типа XDocument хранит ссылку на объект, с помощью которого мы сможем восстановить облик дерева TreeView из XML-документа, сохраненного в файле xmlFile.

Методы класса WMIControl

Разработаем главный метод, который начинает работу компонента. Он строит дерево пространств имен WMI либо на основе файла xmlFile, либо путем опроса базы данных WMI.

public void SetNamespaces()

{

lblCount.Text = "Filling the tree...";

treeNS.Enabled = false;

nsCount = nsHidden = 0;

if (IsTreeSaved())

{

ReadNamespaces();

lblCount.Text = nsCount + " namespaces";

}

else

{

QueryNamespaces();

lblCount.Text = nsCount + " namespaces (" + nsHidden + " hidden)";

}

treeNS.Enabled = true;

treeClasses.Nodes.Add("WMI Classes", "WMI Classes", 0, 0);

treeNS.AfterSelect += new TreeViewEventHandler(treeNS_AfterSelect);

treeClasses.AfterSelect += new TreeViewEventHandler(treeClasses_AfterSelect);

}

Метод SetNamespaces должен быть вызван один раз в жизни приложения. В этот момент он должен создать обработчик события AfterSelect для объекта treeNS класса TreeView. Поэтому добавьте вызов метода SetNamespaces в обработчик события Load главной формы приложения (см. проект Client).

wmi.SetNamespaces();

Вновь вернитесь в проект Library и позвольте механизму IntelliSense создать заготовки недостающих методов, а также обработчик treeNS_AfterSelect. Здесь проверяются усвоенные вами навыки разработки приложений .NET. Код private-методов IsTreeSaved, ReadNamespaces и QueryNamespaces необходимо разработать. Рассмотрим один из этих методов. Он проверяет, существует ли файл, в котором хранится структура дерева пространств имен WMI.

bool IsTreeSaved()

{

xmlFile = Globals.FindFolder("Data");

if (xmlFile != null)

{

xmlFile += "WMI.xml";

if (File.Exists(xmlFile))

return true;

}

return false;

}

Для хранения утилит, логика которых не привязана к какому-либо классу приложения, полезно создать отдельный статический класс (я назвал его Globals, ранее для таких целей мы использовали имя Helper). Добавьте в проект такой класс (он должен иметь описатель static, что запрещает добавлять в него обычные методы). Затем добавьте в этот класс известный вам метод FindFolder.

Опрос базы данных WMI

Пространства имен WMI организованы в иерархическую древообразную структуру. Работая с деревьями в курсе ООП, вы узнали, что такими структурами удобно управлять, опираясь на рекурсивные процедуры. Метод QueryNamespaces должен вызвать рекурсивную процедуру, которая пройдет по всем ветвях дерева (путем опроса базы данных WMI) и построит дерево, управляемое классом TreeView. Последнее уже создано (treeNS) и оно призвано отобразить на экране структуру пространств имен WMI.

Пусть имя рекурсивной процедуры опроса будет RecurseNamespaces. На вход этого метода надо подать имя узла, который является корнем дерева. Этим именем, как было сказано ранее, является строка "root". Так как процедура опроса и построения дерева TreeView требует времени, то чуть позже мы создадим вспомогательную форму поддерживаемую классом FormSplash.

Splash Window — термин, обозначающий окно-заставку, которое развлекает пользователя во время выполнения длительных вычислений или операций поиска.

Нам будет, чем развлекать пользователя, так как попытка получить информацию о некоторых объектах WMI вызовет исключения. Мы обработаем их и покажем причину в окне FormSplash.