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

How to find available parallel ports and their I/O addresses using Delphi and WMI

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

谢谢。


必须尝试从WMI中提取复杂的信息。我试图在我的PC上找到并行端口地址,这是该报告:

首先,我查询了Win32_ParallelPort类以查找所有并行端口。 (使用与他之前的帖子中的PRUZ相同的代码):'选择*来自Win32_ParallelPort'。结果是(我的系统中只有一个并行端口):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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("选择*从Win32_PnPAllocatedResource")。我在这里有很多信息,但是我仅通过PNPDeviceID =" ACPI \\\\ PNP0401 \\\\ 4"选择了3个条目


n


@Brian,您只需使用Win32_parallelPort类即可获取信息。

检查此代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
program GetWMI_ParallelPortInfo;

{$APPTYPE CONSOLE}

uses
  Windows,
  Classes,
  ActiveX,
  Variants,
  SysUtils,
  WbemScripting_TLB in '..\\..\\Documents\
AD 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


也许这会对您有帮助:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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\
oot\\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;