2010-03-05 8 views
5

Ich sehe, dass WMI sehr mächtig ist und in der Lage sein scheint, die meisten Eigenschaften einer PC-Hardware zurückzugeben. Ich möchte die verfügbaren parallelen Anschlüsse auf jedem PC anzeigen und ihre E/A-Adressen finden - ich weiß, dass dies normalerweise mit einem Kernel-Treiber getan wird, aber das ist ein Vermächtnis brauchen - nicht fragen! Derzeit suchen wir im Geräte-Manager und müssen dann die dort angezeigte Adresse eingeben. Ich möchte WMI verwenden, um diese Informationen herauszufinden. Es gibt eine ausgezeichnete Reihe von WMI-Klassen bei 1, aber ich kann nicht sehen, wie man iteriert.So finden Sie verfügbare parallele Ports und ihre E/A-Adressen mit Delphi und WMI

Danke.

Antwort

2

Man muss eine komplexe Informationen aus WMI zu extrahieren experimentieren. Ich habe versucht, die parallelen Hafen-Adressen auf meinem PC zu finden, und das ist der Bericht:

Zuerst habe ich Win32_ParallelPort-Klasse abgefragt, um alle parallelen Häfen zu finden. (mit dem gleichen Code wie PRUZ in seinem Beitrag zuvor): 'Wählen Sie * Von Win32_ParallelPort'. Das Ergebnis ist (ich nur eine parallele Schnittstelle in meinem System):

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"; 
}; 

Zweitens, ich habe abgefragt Win32_PNPAllocatedResource ('Select * From Win32_PnPAllocatedResource'). Ich habe hier eine Menge Informationen, aber ich habe nur die 3 Einträge von PNPDeviceID = "ACPI \ PNP0401 \ 4 & 25C6B52A & 0" ausgewählt.

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\""; 
}; 

Der dritte Eintrag ist von keinem Interesse. Die ersten beiden Einträge gibt uns zwei (dezimal) Adressen ab (888 und 1912)

Endlich habe ich Win32_PortResource (‚Select * From Win32_PortResource‘) abgefragt, um die End-Adressen zu finden, entsprechend der Startadressen 888 und 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"; 
}; 

Aktualisiert

ich den gleichen Code wie RRUZ verwendet haben, in GUI-Anwendung (siehe unten). Das einzige, was Sie kompilieren müssen, ist die Einheit WbemScripting_TLB.pas. Das Gerät von Typ-Bibliothek Import-Wizard generiert wird, können Sie über den Prozess in Delphi 2009 in 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

Das sieht vielversprechend aus Serg - die Adressen sind mein Ziel - jede Chance auf einen rohen Delphi-Code? Danke Brian. –

+0

@Serg: Großartig - ich werde experientieren. Vielen Dank. Brian. –

+0

@Serg: Das funktioniert super, vielen Dank - genau das, was ich brauchte, um mich zu starten. –

1

Kann sein, das wird Ihnen helfen:

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

@ Brian, die Sie gerade die Win32_parallelPort Klasse verwenden, um die Informationen zu erhalten.

überprüfen Sie diesen Code.

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 Danke, der Code gibt mir einen Anfang. Wie finde ich bitte den 'StartAddress' Parameter? Brian. –

+0

@RRUZ: Danke für die Hinweise - jetzt gelöst. –

1

las ich verstehe nicht, was sind die Werte, die Sie benötigen.
Wenn Sie dies wissen müssen:

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

ich glaube, Sie es in Win32_PortResource Klassen und Win32_portConnector

Können Sie bestätigen, finden, dass dies so ist?
Machen Sie einen Test; Öffnen Sie ein CMD-Fenster und geben Sie:
> WMIC PORT Liste FULL

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

Wenn dies der Wert ist, den Sie suchen, können Sie ein new component in GLibWMI entwickeln (oder sagen zu mir um Hilfe Sie), dass rufen Sie diese Werte ab.

Grüße.

PD: Entschuldigung für die Fehler mit Englisch.

+0

Ja! Genau das möchte ich. Ich verstehe nicht, wie man die Informationen zeigt, und ein allgemeines Problem ist, wenn es zwei parallele Häfen gibt, muss ich die Informationen für beide, nicht nur die erste kennen. Ich hoffe, ich bin nicht verwirrt. Dein Englisch ist gut! Brian. –

Verwandte Themen