首页 > 解决方案 > 在 golang 中调用带有 WMI 类参数的方法

问题描述

我正在尝试调用 WmiMonitorBrightnessMethods 类的 WmiSetBrightness 方法:

https://docs.microsoft.com/en-us/windows/desktop/wmicoreprov/wmisetbrightness-method-in-class-wmimonitorbrightnessmethods

在https://github.com/go-ole/go-ole调用 WMI 类方法的示例代码的帮助下

我不知道为什么它一直返回错误:

wmi: error calling method WmiSetBrightness: Exception occurred. (Invalid method Parameter(s) )

我已经搜索了一段时间,但我仍然无法弄清楚传递 Timeout 和 Brightness 这两个参数的正确方法。

我的代码如下:

func main() {
    err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)
    if err != nil {
        log.Fatal(err)
    }

    unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
    if err != nil {
        log.Fatal(err)
    }
    defer unknown.Release()

    wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
    if err != nil {
        log.Fatal(err)
    }
    defer wmi.Release()

    serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, `root/WMI`)
    if err != nil {
        log.Fatal(err)
    }
    service := serviceRaw.ToIDispatch()
    defer serviceRaw.Clear()

    typeName := "WmiMonitorBrightnessMethods"
    typeRaw, err := oleutil.CallMethod(service, "Get", typeName)
    if err != nil {
        log.Fatalf("wmi: error fetching type %v: %v", typeName, err)
    }
    typeResult := typeRaw.ToIDispatch()
    defer typeRaw.Clear()

    methodName := "WmiSetBrightness"
    // Set Brightness value to 20 with the Timeout 1
    methodRaw, err := oleutil.CallMethod(typeResult, methodName, 1, 20)
    if err != nil {
        log.Fatalf("wmi: error calling method %v: %v", methodName, err)
    }
    item := methodRaw.ToIDispatch()
    defer methodRaw.Clear()
    _ = item
}

标签: gowmi

解决方案


推荐阅读