2010-03-05 8 views
5

Я вижу, что WMI очень мощный и, похоже, способен вернуть большинство свойств аппаратного обеспечения ПК. Я хотел бы отображать доступные параллельные порты на любом ПК и находить их адреса ввода-вывода. Я знаю, что обычно это делается с помощью драйвера ядра, но это устаревшая необходимость - не спрашивайте! В настоящее время мы смотрим в диспетчере устройств, а затем вводим адрес, отображаемый там. Я хотел бы использовать WMI, чтобы узнать эту информацию. Есть отличный набор классов WMI в 1, но я не вижу, как итерации.Как найти доступные параллельные порты и их адреса ввода-вывода с использованием Delphi и WMI

Спасибо.

ответ

2

Нужно экспериментировать, чтобы извлечь комплексную информацию из WMI. Я попытался найти адреса параллельного порта на моем ПК, и это отчет:

Прежде всего, я задал класс Win32_ParallelPort, чтобы найти все параллельные порты. (используя тот же код, что и PRUZ в своем сообщении раньше): 'Выберите * Из Win32_ParallelPort'. В результате (у меня есть только один параллельный порт в моей системе):

instance of Win32_ParallelPort 
{ 
    Availability = 3; 
    Caption = "LPT1"; 
    ConfigManagerErrorCode = 0; 
    ConfigManagerUserConfig = FALSE; 
    CreationClassName = "Win32_ParallelPort"; 
    Description = "LPT1"; 
    DeviceID = "LPT1"; 
    Name = "LPT1"; 
    OSAutoDiscovered = TRUE; 
    PNPDeviceID = "ACPI\\PNP0401\\4&25C6B52A&0"; 
    PowerManagementSupported = FALSE; 
    ProtocolSupported = 17; 
    SystemCreationClassName = "Win32_ComputerSystem"; 
    SystemName = "JUPITER"; 
}; 

Во-вторых, я опрашивается Win32_PNPAllocatedResource ('Select * From Win32_PnPAllocatedResource'). У меня здесь много информации, но я выбрал только 3 записи PNPDeviceID = «ACPI \ PNP0401 \ 25C6B52A & 0».

instance of Win32_PNPAllocatedResource 
{ 
    Antecedent = "\\\\JUPITER\\root\\cimv2:Win32_PortResource.StartingAddress=\"888\""; 
    Dependent = "\\\\JUPITER\\root\\cimv2:Win32_PnPEntity.DeviceID=\"ACPI\\\\PNP0401\\\\4&25C6B52A&0\""; 
}; 


instance of Win32_PNPAllocatedResource 
{ 
    Antecedent = "\\\\JUPITER\\root\\cimv2:Win32_PortResource.StartingAddress=\"1912\""; 
    Dependent = "\\\\JUPITER\\root\\cimv2:Win32_PnPEntity.DeviceID=\"ACPI\\\\PNP0401\\\\4&25C6B52A&0\""; 
}; 


instance of Win32_PNPAllocatedResource 
{ 
    Antecedent = "\\\\JUPITER\\root\\cimv2:Win32_DMAChannel.DMAChannel=3"; 
    Dependent = "\\\\JUPITER\\root\\cimv2:Win32_PnPEntity.DeviceID=\"ACPI\\\\PNP0401\\\\4&25C6B52A&0\""; 
}; 

Третий вход не представляет интереса. Первые две записи дают нам два (десятичные), начиная с адресом (888 и 1912)

Наконец я опрошена Win32_PortResource («Select * From Win32_PortResource»), чтобы найти конечные адреса, соответствующие исходным адрес 888 и 1912:

instance of Win32_PortResource 
{ 
    Alias = FALSE; 
    Caption = "0x00000378-0x0000037F"; 
    CreationClassName = "Win32_PortResource"; 
    CSCreationClassName = "Win32_ComputerSystem"; 
    CSName = "JUPITER"; 
    Description = "0x00000378-0x0000037F"; 
    EndingAddress = "895"; 
    Name = "0x00000378-0x0000037F"; 
    StartingAddress = "888"; 
    Status = "OK"; 
}; 


instance of Win32_PortResource 
{ 
    Alias = FALSE; 
    Caption = "0x00000778-0x0000077B"; 
    CreationClassName = "Win32_PortResource"; 
    CSCreationClassName = "Win32_ComputerSystem"; 
    CSName = "JUPITER"; 
    Description = "0x00000778-0x0000077B"; 
    EndingAddress = "1915"; 
    Name = "0x00000778-0x0000077B"; 
    StartingAddress = "1912"; 
    Status = "OK"; 
}; 

Обновлено

Я использовал тот же код, RRUZ в приложение с графическим интерфейсом (см. ниже) Единственное, что вам нужно скомпилировать, это блок WbemScripting_TLB.pas. Блок генерируется библиотека типа мастера импорта, вы можете прочитать о процессе в Delphi 2009 в my blog

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    TForm1 = class(TForm) 
    Memo1: TMemo; 
    Button4: TButton; 
    Button5: TButton; 
    Button6: TButton; 
    procedure Button4Click(Sender: TObject); 
    procedure Button5Click(Sender: TObject); 
    procedure Button6Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

uses WbemScripting_TLB, ActiveX; 


{$R *.dfm} 


procedure TForm1.Button4Click(Sender: TObject); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    Memo1.Lines.Clear; 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_PnPAllocatedResource','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Memo1.Lines.Add(SWbemObject.GetObjectText_(0)); 
    end; 
    end; 
end; 

procedure TForm1.Button5Click(Sender: TObject); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    Memo1.Lines.Clear; 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_PortResource','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Memo1.Lines.Add(SWbemObject.GetObjectText_(0)); 
    end; 
    end; 
end; 

procedure TForm1.Button6Click(Sender: TObject); 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    Memo1.Lines.Clear; 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_ParallelPort','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Memo1.Lines.Add(SWbemObject.GetObjectText_(0)); 
    end; 
    end; 
end; 

end. 
+0

Это выглядит многообещающим Serg - адреса - моя цель - любой шанс на какой-то грубый код Delphi? Спасибо Брайан. –

+0

@Serg: Отлично. Я буду опытным. Благодарю. Брайан. –

+0

@Serg: Это отлично работает, огромное спасибо - именно то, что мне нужно, чтобы начать меня. –

1

Может быть, это поможет вам:

uses ComObj, ActiveX; 

function TForm1.GetObject(const objectName: String): IDispatch; 
var 
    bindCtx: IBindCtx; 
    moniker: IMoniker; 
    chEaten: Integer; 
begin 
    OleCheck(CreateBindCtx(0, bindCtx)); 
    OleCheck(MkParseDisplayName(bindCtx, StringToOleStr(objectName), chEaten, moniker)); 
    OleCheck(moniker.BindToObject(bindCtx, nil, IDispatch, Result)); 
end; 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    objWMIService: OLEVariant; 
    colItems, colItem: OLEVariant; 
    oEnum : IEnumvariant; 
    iValue, test : longword; 
begin 
    objWMIService := GetObject('winmgmts:\\YourPCname\root\CIMV2'); 
    colItems := objWMIService.ExecQuery('SELECT * FROM Win32_ParallelPort',,48); 
    oEnum := IUnknown(colItems._NewEnum) as IEnumVariant; 
    while oEnum.Next(1, colItem, iValue) = 0 do begin 
    //You can get all the properties here 
    //for example colItem.Caption 
    // properties of Win32_ParalelPort class : http://msdn.microsoft.com/en-us/library/aa394247%28VS.85%29.aspx 
    end; 
end; 
1

@ Брайан, вы просто использовать Win32_parallelPort класс, чтобы получить информацию.

Проверьте этот код.

program GetWMI_ParallelPortInfo; 

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    Classes, 
    ActiveX, 
    Variants, 
    SysUtils, 
    WbemScripting_TLB in '..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas'; 

procedure GetWMIParallelPortInfo; 
var 
    WMIServices : ISWbemServices; 
    WMILocator : ISWbemLocator; 
    Root   : ISWbemObjectSet; 
    SWbemObject : ISWbemObject; 
    Item   : IEnumVariant; 
    rgVar  : OleVariant; 
    pCelFetched : Cardinal; 

begin 
    WMILocator := CoSWbemLocator.Create(); 
    WMIServices := WMILocator.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); // 
    Root := WMIServices.ExecQuery('Select * From Win32_ParallelPort','WQL', 0, nil); 
    Item := (Root._NewEnum) as IEnumVariant; 
    while (Item.Next(1, rgVar, pCelFetched) = S_OK) do 
    begin 
    SWbemObject := IUnknown(rgVar) as ISWBemObject; 
    if (SWbemObject <> nil) then 
    begin 
     SWbemObject.Properties_;//Load the Properties to read 
     Writeln(SWbemObject.GetObjectText_(0));//The GetObjectText_ method of the SWbemObject object returns a textual rendering of the object in MOF format 
    end; 
    end; 
end; 

begin 
try 
    CoInitialize(nil); 
    try 
     GetWMIParallelPortInfo; 
     Readln; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:Exception do 
    Begin 
     Writeln(E.Classname, ': ', E.Message); 
     Readln; 
    End; 
    end; 
end. 

alt text http://i48.tinypic.com/2e67wxz.png

+0

@RRUZ Спасибо, код дает мне начало. Как мне найти параметр «StartAddress»? Брайан. –

+0

@RRUZ: Спасибо за указатели - теперь решена. –

1

Я не понимаю, что те ценности, которые нужны.
Если вам необходимо знать следующее:

alt text http://img682.imageshack.us/img682/2382/imagen333.png

Я думаю, вы можете найти его в Win32_PortResource классов и Win32_portConnector

Можете ли вы подтвердить, что это так?
Проведите тест; Открыть ЦМД окна и тип:
> WMIC PORT Полный список

alt text http://img215.imageshack.us/img215/1696/imagen332.png

Если это значение, которое вы ищете, вы можете разработать new component in GLibWMI (или сказать мне за помощью вы), что извлеките эти значения.

С уважением.

PD: Excuseme для ошибок с английским.

+0

Да! Это именно то, что я хотел бы. Однако я не понимаю, как показывать информацию, и общая проблема заключается в том, что есть два параллельных порта, мне нужно знать информацию для обоих, а не только для первого. Надеюсь, я не смущаюсь. Ваш английский хорошо! Брайан. –