Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизПроблема с WMI Найти похожие ветки
← →
pavel_guzhanov (2004-10-25 09:21) [0]Добрый день!
Написал я программку, которая с помощью WMI выдает информацию об установленных в компьютере железяках. В частности для получения инфы о CDROM использую класс Win32_CDROMDrive. Определяю имя CDROM, все работает нормально. Но если в компьютере установлено 2сидюка, то инфа получается только об одном. Отсюда вопрос, как мне получить информацию об обоих CDROM? Ведь WMI CimStudio их прекрасно видит. Я пробовал указать у Get_Value индексы, но Delphi ругается на это
← →
Ozone © (2004-10-25 09:24) [1]Читал статью на королевстве? Еще раз внимательно прочитай и просмотри все исходники.
← →
Дмитрий Ботвин (2004-10-25 09:31) [2]Попробуй вот так:
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
← →
pavel_guzhanov (2004-10-25 09:42) [3]А можно с комментариями? А то не хочется тупо скопировать код, желательно бы разобраться...
← →
Дмитрий Ботвин (2004-10-25 09:43) [4]Какой момент не понятен???
← →
pavel_guzhanov (2004-10-25 10:01) [5]Лучше бы от начала до конца, ибо это мой первый опыт использования WMI
← →
Дмитрий Ботвин (2004-10-25 10:16) [6]Этот код я составил на основе статьи о применении WMI в Delphi:
http://delphi.olympus.ru/dk/mastering/wmi.htm
Я думаю там более корректно написано каким образом использовать
WMI, т.к. я тока составил код на основе этой статьи...
← →
pavel_guzhanov (2004-11-15 12:59) [7]
> Дмитрий Ботвин
Спасибо большое! Вернулся к этой задаче, разобрался, все работает
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c