在 Go 中调用 windows API 时如何获取 Windows 系统错误代码

How to get Windows system error code when calling windows API in Go

我在 Go 中使用 windows 服务管理器包 golang.org\x..\windows\svc\mgr。调用此包的 OpenService 时,我收到错误消息 The specified service does not exist as an installed service. 而不是 windows 系统错误代码,在本例中为 1060 https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1000-1299-

这是代码

package service

import (
    "fmt"
    "os"
    "os/signal"
    "strconv"
    "strings"
    "sync"
    "time"
    "unsafe"

    "golang.org/x/sys/windows/registry"
    "golang.org/x/sys/windows/svc"
    "golang.org/x/sys/windows/svc/eventlog"
    "golang.org/x/sys/windows/svc/mgr"
)

func (ws *windowsService) Status() (Status, error) {
    m, err := mgr.Connect()
    if err != nil {
        return StatusUnknown, err
    }
    defer m.Disconnect()

    s, err := m.OpenService(ws.Name)
    if err != nil {
        if err.Error() == "The specified service does not exist as an installed service." {
            return StatusUnknown, ErrNotInstalled
        }
        return StatusUnknown, err
    }

    // Rest of the code.
}

err.Error() returns 仅显示错误消息,因此如果 windows returns 错误消息为英文,则上述代码有效。但如果 OS 中不存在英语资源,则会失败,因为错误消息将以不同的语言返回。

在命令提示符中执行 sc query servicename 时,它会 returns 错误代码和消息。 Example.

那么,如何在 Go 中获取 windows 系统错误代码以及错误消息?

您可以对 syscall.Errno 进行类型断言。这将使您可以像处理 int 值一样处理它。

示例:

if syserr, ok := err.(syscall.Errno); ok {
    if syserr == 1060 {
        //Do whatever
    }
}