![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с 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]Читал статью на королевстве? Еще раз внимательнопрочитай и просмотри всеисходники.