ВК на Delphi
Griffon
24.04.2009 - 12:46
|
Доброго времени суток. Решил написать ВК для перебора членов (объектов коллекции) WMI класса. Если в 8.0 мы можем использовать для коллекции класса замечательную конструкцию "для каждого из", то в 7.7, как пишет Андрей Михайлов в своей книге "1С:Предприятие. Системное программирование", необходимо использовать ВК. В своей внешней компоненте я использую библиотеку WMIEXTENSIONLib_TLB с такими типами данных, как SWbemObject, SWbemPropertySet. Функция получает коллекцию и порядковый номер объекта который нужно вернуть 1С-ке, находит этот объект и присваивает значению функции, как я понимаю, указатель на объект. 1С получает НЕЧТО, что на просьбу Сообщить(НЕЧТО) выдает "OLE.ISWbemObjectEx". Вряд ли это объект WMI класса, потому как на любое свойство этого объекта выдает "Значение не представляет агрегатный объект (Caption)". Одним словом я в тупике. Бьюсь уже несколько дней, с самим Дельфи работаю всего неделю, так что просьба не критиковать сильно: function TWMIExplorer.EnumerateCollection(const ObjSet: ISWbemObjectSet; Number: Integer): OleVariant; var Enum : IEnumVariant; var TempObj : OleVariant; var Value : Cardinal; var Current : Integer; var SObject : ISWbemObject; var s : OleVariant; begin Enum:= (ObjSet._NewEnum) as IEnumVariant; Current := 0; s:=0; while (Enum.Next(1, TempObj, Value) = S_OK) do begin Current := Current + 1; if Current = Number then begin SObject := IUnknown(TempObj) as ISWBemObject; EnumerateCollection:= IDispatch(SObject); end; end; end; и кусок кода 1С: // Создаем указатель на объект SWbemLocator Попытка Locator = СоздатьОбъект("WbemScripting.SWbemLocator"); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; // Шаг 1. Подключение к WMI на локальном компьютере ServicesSet = Locator.ConnectServer("."); // Шаг 2. Извлечение экземпляров класса Win32_LogicalDisk ObjectSet = ServicesSet.InstancesOf("Win32_LogicalDisk") ; // Шаг З. Просмотр SWbemObjectSet, содержащего экземпляры Для Ном = 0 По ObjectSet.Count-1 Цикл Item = WMIExplorer.EnumerateCollection(ObjectSet, Ном); Сообщить(Item); КонецЦикла; |