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. |
也许这会对您有帮助:
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; |