【发布时间】:2022-01-13 21:52:44
【问题描述】:
我对@987654324@ 很陌生,我对COM 对象有疑问。
我想模仿的是Powershell one-liner:
(Get-WMIObject Win32_PnPEntity).GetDeviceProperties("DEVPKEY_Device_BusReportedDeviceDesc").DeviceProperties.Data
到目前为止,我的代码是这样的:
#NoEnv ; Don't check empty variables to see if they are environment variables.
#Warn ; Enable warnings.
#SingleInstance Force ; Force single instance.
SendMode, Input ; Send is an alias for SendInput. Faster and safer.
SetNumLockState, AlwaysOn ; NumLock is always on, the key does not have any future effect.
SetWorkingDir, % A_Desktop
DetectHiddenWindows, On ; Detect hidden windows, needed for PostMessage.
for device in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_PnPEntity") {
keys := ComObjArray(0xC, 1) ; VT_VARIANT
props := ComObjArray(0xC, 1)
keys[0] := "DEVPKEY_Device_BusReportedDeviceDesc"
result := device.GetDeviceProperties(keys, props)
if (!result)
MsgBox, % props[0]
}
函数调用返回0,据我所知是正确的。但是props 数组似乎是空的。
我认为我现在的问题是:props 是一个ByRef 变量,但我尝试使用一些我发现的代码来创建ByRef 变量(here)以获取返回值,但没有任何成功。
显然我在函数调用上做错了,因为我完全不知道如何使用来自AutoHotKey 的COM。
是的,我知道我可以在这里使用setupapi.dll,或者一些第三方库,甚至是PowerShell one-liner,但是我正在尝试从AutoHotKey学习如何使用COM,如何调用@ 987654337@对象方法等
因此,非常感谢任何帮助。提前非常感谢。
Here is GetDeviceProperties function signature, for reference.
【问题讨论】:
-
现在不要 AHK,但这里有一个 C# 版本,如果有帮助的话:stackoverflow.com/questions/69362886/…
-
谢谢,西蒙。我已经知道如何在 C#(或 C 中)做到这一点,我的问题是在 AHK 中构建正确的类型、变量等,这很难做到。
-
嗯,不确定 AHK,但据我了解,您不像我在 C# 中那样称呼它。尝试只传递一个参数,它是一个应该包含 2 个项目的 VARIANT 数组。第一项是 BSTR 数组,第二项是空的 VARIANT(返回时填充)
-
Simon,我不是故意使用InvokeMethod,因为我想学习如何直接调用COM对象方法。当然,如果我不能这样做,我将使用 InvokeMethod 或在 setupapi.dll 上使用 DLLCall 来完成。所有这些方法都有效,但我想学习这一点:) 但我会尝试你的建议,只使用一个参数,好主意。
-
Simon,我试过了,它似乎也不起作用。函数调用失败并出现错误信号,表明参数无效,因此问题不依赖于此。我想我遗漏了一些非常明显的东西,但我一辈子都看不到它。
标签: com autohotkey