Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как узнать производителя CD/DVD


Автор: eralex 1.1.2005, 02:41
Допустим у меня есть несколько CD/DVD-ов, в том числе виртуальные.
Как узнать их производителя и номер модели, например, NEC 3500A.
Желательно НЕ ЧЕРЕЗ РЕЕСТР.

Автор: Alex 2.1.2005, 23:26
http://www.rsdn.ru/Forum/Message/905806.htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_cdromdrive.asp

Автор: eralex 3.1.2005, 00:43
WMI работает только под Win2000 и XP.
А как под Win98?

Автор: Akella 4.1.2005, 11:53
Будь ласка, пэрэвэдить код на Delphi
Код

using System;
using System.Management;
class EnumCD
{
const string QUERY = "SELECT * FROM Win32_CDROMDrive";
const string PROPERTY_NAME = "Name";
static void Main()
{
 ManagementObjectSearcher cdSearcher = new ManagementObjectSearcher(QUERY);
 foreach(ManagementObject cdRom in cdSearcher.Get())
  Console.WriteLine(cdRom[PROPERTY_NAME]);
}
}



Добавлено @ 12:02
А вот еще, перевести можно и после включить в нашу DRKB smile
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__getting_wmi_data_from_the_local_computer.asp

Автор: eralex 4.1.2005, 18:47
Как это сделать через WMI я вроде разобрался.
Только не нравиться мне, что приходится перебирать в цикле все свойства
Win32_CDROMDrive. Может кто знает как сразу к конкретному свойству обратиться, т.е.
избавиться от строки "while PropEnum.Next(1, TempObj, Value) = S_OK do"

Вот рабочий пример для D7.

Код
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, WbemScripting_TLB, OleServer, ActiveX, StdCtrls, ExtCtrls,
 ComCtrls;
type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   SWbemLocator1: TSWbemLocator;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
 Service: ISWbemServices;
 ObjectSet: ISWbemObjectSet;
 SObject: ISWbemObject;
 PropSet: ISWbemPropertySet;
 SProp: ISWbemProperty;
 PropEnum, Enum: IEnumVariant;
 TempObj: OleVariant;
 Value: Cardinal;
 dr:string;
begin
 ListBox1.Clear;
 Service:= SWbemLocator1.ConnectServer('.', 'root\CIMV2', '', '', '','', 0, nil);
 SObject:= Service.Get('Win32_CDROMDrive', wbemFlagUseAmendedQualifiers, nil);
 ObjectSet:= SObject.Instances_(0, nil);
 Enum:= (ObjectSet._NewEnum) as IEnumVariant;
 dr:='';
 while (Enum.Next(1, TempObj, Value) = S_OK) 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;
     if SProp.Name='Drive' then dr:=SProp.Get_Value;
     if SProp.Name='Name' then ListBox1.AddItem(dr+'  '+SProp.Get_Value, nil);
   end;
 end;
end;
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)