如何枚举Windows LPT端口及其I/O范围?

yat*_*asu 2 windows wmi lpt

我正在研究通过lpt端口控制某些设备的项目.我使用inpout32.dll获取端口的原始访问权限,现在尝试枚举所有可用的LPT端口并获取其I/O范围.

我现在可以检查设备管理器,但是还有更自动化的方法吗?

现在我试图使用WMI一些应该可以工作的示例代码,但事实并非如此

Set wmiService = GetObject("winmgmts:\\.\root\cimv2")

Set parallelports = wmiService.ExecQuery("SELECT * FROM Win32_ParallelPort")                      

For Each port In parallelports
    q = "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID = '" & port.PNPDeviceID & "'"
    Set pnpentities = wmiService.ExecQuery(q)

    For Each pnpentity In pnpentities
        wscript.echo pnpentity.PNPDeviceID
    Next
Next
Run Code Online (Sandbox Code Playgroud)

在线上'For Each pnpentity In pnpentities'我得到了错误.如果找到相应的实体会帮助我,我也不会感到害羞.

PS.最后我想出了如何枚举lpt i/o端口范围.

Set wmiService = GetObject("winmgmts:\\.\root\cimv2")

Set parallelports = wmiService.ExecQuery("SELECT * FROM Win32_ParallelPort")

For Each port In parallelports
    Set port_resources = wmiService.ExecQuery("ASSOCIATORS OF {Win32_ParallelPort.DeviceID='" & port.DeviceID & "'} WHERE ResultClass = Win32_PortResource")

    For Each port_resource In port_resources
        wscript.echo port_resource.Caption
    Next
Next
Run Code Online (Sandbox Code Playgroud)

Hel*_*len 5

您收到错误,因为PNPDeviceID包含反斜杠(\)和WQL查询中的反斜杠必须加倍.只是做了更换的\\\port.PNPDeviceID其插入到你的查询之前,你的脚本将正常工作:

strPNPDeviceID = Replace(port.PNPDeviceID, "\", "\\")
Set pnpentities = wmiService.ExecQuery( _
    "SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID = '" & strPNPDeviceID & "'")
Run Code Online (Sandbox Code Playgroud)


您可能还会发现此问题很有用:如何使用Delphi和WMI查找可用的并行端口及其I/O地址.