![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопросы возникли по получению инфы с помощью WMI :) [D5, Win95/98, Win2k, WinXP]
TankMan © (2004-11-30 14:15:00)Вот недавно (месяц назад) спрашивал как получить инфу о видеокарте, чипсете и тому подобную инфу - Посоветовали WMI использовать - Ну я вобщем-то почитал на счет WMI некоторую инфу, посмотрел примерчик(два,три,ну может четыре) Вроде почти все понял как да зачем и решил по экспериментировать, врезультате таких вот экспериментов возникло несколько вопросов.
Какой объект нужно указывать в параметре функции Service.Get(..,) чтобы получить список устройства с неполадками? Вот например Sysinfo32 в подкаталоге "компоненты" есть раздел "Устройства с неполадками" вот там отображаются также неустановленные устройства, вот я хочу получить их список из программы?
Хотелось бы еще узнать мнение правилен ли этот код?
procedure TForm1.Button1Click(Sender: TObject);
var
Service: ISWbemServices;
ObjectSet: ISWbemObjectSet;
SObject: ISWbemObject;
PropSet: ISWbemPropertySet;
SProp: ISWbemProperty;
PropEnum, Enum: IEnumVariant;
TempObj: OleVariant;
Value: Cardinal;
StrValue: string;
Res:HResult;
begin
Service:= SWbemLocator1.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil);
SObject:= Service.Get('Win32_PnPEntity', wbemFlagUseAmendedQualifiers, nil);
ObjectSet:= SObject.Instances_(0, nil);
// SObject:= ObjectSet.Item('???',0); <<Вот что сдесь указывать? например для 'Win32_PnPEntity' ?
Enum:= (ObjectSet._NewEnum) as IEnumVariant;
Res:=Enum.Next(1, TempObj, Value);
while (Res=0) and (listbox2.items.Count<120) do begin
SObject:= IUnknown(TempObj) as SWBemObject;
PropSet := SObject.Properties_;
PropEnum := (PropSet._NewEnum) as IEnumVariant;
while (PropEnum.Next(1, TempObj, Value) = S_OK) do
begin
SProp:= IUnknown(TempObj) as SWBemProperty;
StrValue:= '';
ListBox1.Items.AddObject(SProp.Name, nil);
ShowProp(SProp);
end;
Res:=Enum.Next(1, TempObj, Value);
end; {while}
end;
procedure TForm1.ShowProp(SProp: SWBemProperty);
var s:string;
begin
if (SProp.Get_Value <> null ) then
begin
with SProp do
begin
if sProp.name<>'' then
s:=Get_Value;
if Name='DeviceID' then
ListBox2.Items.Add(sProp.name+' - '+s)
else
if Name='Description' then
ListBox2.Items.Add(sProp.name+' - '+s)
end; { with }
end; { if }
end;
Почти такой код (почти без изменения касающихся вывода инфы) я взял из примера.
TankMan (2004-12-01 07:26:00) [1]Люди, ну поможите ж кто-нибудь?
TankMan (2004-11-30 14:30:00) [2]<<< Поправочка не Sysinfo32 а Msinfo32.exe которая находится в %WINDIR%\System32\dllcache (в ВинХР точно)
Так же хотелось бы узнать:
Win32_OnBoardDevice - Почему ничего не выдает :(
Win32_PhysicalMedia - я так понимаю это жесткие, но вот почему Manufacturer не выдается?
Win32_DriverVXD - не выдает ничего :(
Win32_Fan,Win32_Refrigeration,Win32_HeatPipe - почему-то не выдает ничего :(
Win32_Printer - а где посмотреть, что чего значит?
А еще, самое главное - как читать массивы, значения типа boolean и т.д.? В примере если свойство с типом boolean пишется в ListBox1 а вот в процедуре ShowProp, значение этого свойства вывести не удается в listbox2 :( да и массивы тоже не получается :(
Еще вот вопрос, допустим я используя Win32_IRQResource получаю все IRQ, но как получить устройства, которые "подключены на" это прерывание? т.е. Опять же смотря на Msinfo32.exe открывая закладку "Ресурсы аппаратуры" и заходя в раздел "Прерывания (IRQ)" - выдается список прерываний и устройств работающих на этих прерываниях, так вот, как получить эти устройства?
Когда я запускаю WMI Object Browser и выбираю Win32_IRQResource мне выдается дерево объектов, но вот как это реализовано, чтобы найдя например IRQ 10, я мог узнать какие объкты "прикреплены" к нему?
Воооот.. :) скока впросов получилось, но всеже надеюсь что никто не сочтет это за чрезмерную лень, и поможет мне...