Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с WMI [D7, Win2k, WinXP]


pavel_guzhanov ©   (2004-10-25 09:21:00) 

Добрый день!
Написал я программку, которая с помощью WMI выдает информацию об установленных в компьютере железяках. В частности для получения инфы о CDROM использую класс Win32_CDROMDrive. Определяю имя CDROM, все работает нормально. Но если в компьютере установлено 2сидюка, то инфа получается только об одном. Отсюда вопрос, как мне получить информацию об обоих CDROM? Ведь WMI CimStudio их прекрасно видит. Я пробовал указать у Get_Value индексы, но Delphi ругается на это


pavel_guzhanov   (2004-11-15 12:59:00) [1]


> Дмитрий Ботвин

Спасибо большое! Вернулся к этой задаче, разобрался, все работает


Дмитрий Ботвин   (2004-10-25 10:16:00) [2]

Этот код я составил на основе статьи о применении WMI в Delphi:
http://delphi.olympus.ru/dk/mastering/wmi.htm
Я думаю там более корректно написано каким образом использовать
WMI, т.к. я тока составил код на основе этой статьи...


pavel_guzhanov   (2004-10-25 10:01:00) [3]

Лучше бы от начала до конца, ибо это мой первый опыт использования WMI


Дмитрий Ботвин   (2004-10-25 09:43:00) [4]

Какой момент не понятен???


pavel_guzhanov   (2004-10-25 09:42:00) [5]

А можно с комментариями? А то не хочется тупо скопировать код, желательно бы разобраться...


Дмитрий Ботвин   (2004-10-25 09:31:00) [6]

Попробуй вот так:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs,ActiveX, WbemScripting_TLB,
StdCtrls, ComCtrls, ExtCtrls ;

function ADsEnumerateNext(pEnumVariant: IEnumVARIANT;
cElements: ULONG; var pvar: OleVARIANT;
var pcElementsFetched: ULONG): HRESULT; safecall;
external 'activeds.dll';

type
TForm1 = class(TForm)
  Memo1: TMemo;
  Button1: TButton;
  Edit1: TEdit;
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
  procedure GetInfo(CompName: String);
end;

var
Form1: TForm1;

implementation

procedure DumpWMI_Process(Process: SWBemObject;Memo:TMemo);
var
Enum: IEnumVARIANT;
varArr: OleVariant;
lNumElements: ULong;
SProp: ISWbemProperty;
Prop: OleVariant;
PropName: string;
PropValue: string;
begin
Memo.Lines.Add('+ WMI Path: ' + Process.Path_.Path);
Enum := Process.Properties_._NewEnum as IEnumVariant;
while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and (lNumElements > 0) do
begin
  if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and Assigned(SProp) then
  begin
    PropName  := SProp.Name;
    Prop := SProp.Get_Value;
    if VarTypeAsText(VarType(Prop))='Array Variant' then PropValue := ''
    else PropValue :=VarToStr(Prop);
    Memo.Lines.Add(PropName + ' = ' + PropValue);
  end;
end;
end;

{$R *.dfm}

procedure TForm1.GetInfo(CompName: String);
var
Enum: IEnumVARIANT;
varArr: OleVariant;
lNumElements: ULong;
AName: array[0..255] of Char;
ASize: DWORD;
begin
Memo1.Lines.Clear;
try
  Memo1.Lines.BeginUpdate;
  Enum := CoSWbemLocator.Create.ConnectServer
 (CompName, 'root\cimv2', '', '', '', '', 0, nil).ExecQuery
 ('Select * from '+'Win32_CDROMDrive', 'WQL',
 wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
 while (Succeeded(ADsEnumerateNext(Enum, 1, varArr,
 lNumElements))) and (lNumElements > 0) do
    begin
      DumpWMI_Process(IUnknown(varArr) as SWBemObject,Memo1);
    end;
finally
  Memo1.Lines.EndUpdate;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetInfo(Trim(Edit1.Text));
end;

end.

Здесь Edit1.Text - имя компа, на котором ты хош узнать про CD-ROM


Ozone   (2004-10-25 09:24:00) [7]

Читал статью на королевстве? Еще раз внимательнопрочитай и просмотри всеисходники.


Наверх

Титульная страница Поиск, карта сайта Написать письмо