代码之家  ›  专栏  ›  技术社区  ›  Brian Frost

如何使用delphi和wmi查找可用的并行端口及其I/O地址

  •  5
  • Brian Frost  · 技术社区  · 15 年前

    我看到wmi非常强大,似乎能够返回PC硬件的大部分属性。我想显示任何PC上可用的并行端口并找到它们的I/O地址-我知道通常这是使用内核驱动程序完成的,但这是一个遗留的需求-不要问!目前,我们在设备管理器中查找,然后必须输入显示在那里的地址。我想用wmi找出这个信息。 在 1 但是我看不到如何迭代。

    谢谢。

    4 回复  |  直到 9 年前
        1
  •  2
  •   marc_s    9 年前

    必须进行实验才能从WMI中提取复杂的信息。我试图在我的电脑上找到并行端口地址,报告如下:

    首先,我查询了win32_parallelport类以查找所有并行端口。(使用与之前发布的pruz相同的代码):'select*from 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’)。我在这里有很多信息,但我只选择了pNPdeviceID=“acpi\pnp0401\4&25c6b52a&0”的3个条目。

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

    更新的

    我在GUI应用程序中使用了与rruz相同的代码(见下文)。唯一需要编译的是wbemscripting_tlb.pas单元。该单元是由类型库导入向导生成的,您可以在Delphi2009中了解该过程。 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.
    
        2
  •  1
  •   RRUZ    15 年前

    @布莱恩,你只要用 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

        3
  •  1
  •   SimaWB    15 年前

    也许这能帮助你:

    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;
    
        4
  •  1
  •   Germán Estévez -Neftalí-    15 年前

    我不明白你需要什么样的价值观。
    如果你需要知道这一点:

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

    我想你可以在里面找到它 Win32端口资源 类和 win32端口连接器

    你能证实这是真的吗?
    进行测试;打开一个命令窗口并键入:
    >WMIC端口列表已满

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

    如果这是您正在搜索的值,则可以开发 new component in GLibWMI (或者告诉我帮你)检索这个值。

    当做。

    警察:请原谅我的英语错误。