winapi GetSystemTimes 函数没有填写lpIdleTime/lpKernelTime/lpUserTime

winapi GetSystemTimes function does not fill lpIdleTime/lpKernelTime/lpUserTime

我无法使用 GetSystemTimes 函数。 c++ 代码没有任何问题,但使用 golang 我得到三个 nils 而不是预期值

我的代码:

package main

import (
    "log"
    "syscall"
    "unsafe"
)

var (
    modKernel32 = syscall.NewLazyDLL("kernel32.dll")
    procGetSystemTimes = modKernel32.NewProc("GetSystemTimes")
)

type SystemTimes struct {
    IdleTime   *syscall.Filetime
    KernelTime *syscall.Filetime
    UserTime   *syscall.Filetime
}

func main() {
    times, err := getSystemTimes()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("idle=%v, kernel=%v, user=%v", times.IdleTime, times.KernelTime, times.UserTime)
}

func getSystemTimes() (times SystemTimes, err error) {
    res, _, err1 := procGetSystemTimes.Call(uintptr(unsafe.Pointer(times.IdleTime)), uintptr(unsafe.Pointer(times.KernelTime)), uintptr(unsafe.Pointer(times.UserTime)))
    if res != 1 {
        return times, err1
    }
    return
}

它非常简单,与 stdlib 中的系统调用的 GetProcessTimes 函数非常相似。 看看我的程序打印了什么:

idle=<nil>, kernel=<nil>, user=<nil>

为什么?我期待错误或结果,为什么我的字段是空的?

配置:win8 x64,go1.4.2 windows/amd64

您正在将 nil 字段的地址传递给函数。

要么让它直接指向 Filetime 结构,要么在传递它们之前初始化所有 3 个字段:

type SystemTimes struct {
    IdleTime   syscall.Filetime
    KernelTime syscall.Filetime
    UserTime   syscall.Filetime
}
.....
res, _, err1 := procGetSystemTimes.Call(uintptr(unsafe.Pointer(&times.IdleTime)), uintptr(unsafe.Pointer(&times.KernelTime)), uintptr(unsafe.Pointer(&times.UserTime)))

输出:

┌─ oneofone@Oa [/tmp]                                                                                                             
└──➜ env CC=i686-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=386 go build -a /tmp/syscall.go; and wine syscall.exe
2015/05/09 22:31:53 idle={1292275456 39}, kernel={1436840864 41}, user={3496565408 2}

playground