插件窝 干货文章 Go程序在Windows XP下运行失败:如何解决“找不到GetTickCount64过程”错误?

Go程序在Windows XP下运行失败:如何解决“找不到GetTickCount64过程”错误?

Windows GetTickCount procGetTickCount 版本 212    来源:    2025-03-14

在Windows XP下运行Go程序时,如果遇到“找不到GetTickCount64过程”错误,这是因为GetTickCount64函数在Windows XP中不可用。GetTickCount64是在Windows Vista及更高版本中引入的,而Windows XP只支持GetTickCount函数。

解决方案

  1. 使用GetTickCount代替GetTickCount64

    • 如果你有源代码的控制权,可以将程序中对GetTickCount64的调用替换为GetTickCountGetTickCount返回一个32位的毫秒计数器,大约每49.7天会回绕一次,而GetTickCount64返回一个64位的计数器,不会回绕。
    package main
    
    import (
       "syscall"
       "fmt"
    )
    
    func main() {
       modkernel32 := syscall.NewLazyDLL("kernel32.dll")
       procGetTickCount := modkernel32.NewProc("GetTickCount")
    
       ret, _, _ := procGetTickCount.Call()
       fmt.Printf("Tick count: %d\n", ret)
    }
    
  2. 使用条件编译

    • 如果你希望程序在Windows XP和更高版本的Windows上都能运行,可以使用Go的条件编译功能。通过定义不同的构建标签(build tags),你可以为不同的操作系统版本编写不同的代码。

    创建一个文件windows_xp.go,并在文件顶部添加构建标签:

    // +build windows,xp
    
    package main
    
    import (
       "syscall"
       "fmt"
    )
    
    func main() {
       modkernel32 := syscall.NewLazyDLL("kernel32.dll")
       procGetTickCount := modkernel32.NewProc("GetTickCount")
    
       ret, _, _ := procGetTickCount.Call()
       fmt.Printf("Tick count: %d\n", ret)
    }
    

    然后创建一个文件windows.go,用于更高版本的Windows:

    // +build windows,!xp
    
    package main
    
    import (
       "syscall"
       "fmt"
    )
    
    func main() {
       modkernel32 := syscall.NewLazyDLL("kernel32.dll")
       procGetTickCount64 := modkernel32.NewProc("GetTickCount64")
    
       ret, _, _ := procGetTickCount64.Call()
       fmt.Printf("Tick count: %d\n", ret)
    }
    

    在编译时,使用-tags参数指定构建标签:

    go build -tags xp
    
  3. 使用第三方库

    • 如果你不想手动处理这些细节,可以使用一些第三方库,如github.com/go-ole/go-ole,它们可能已经处理了不同Windows版本之间的兼容性问题。
  4. 升级操作系统

    • 如果可能的话,考虑将操作系统升级到Windows Vista或更高版本。Windows XP已经不再受支持,升级到更新的操作系统可以提高安全性和兼容性。

总结

通过替换GetTickCount64GetTickCount,或者使用条件编译来处理不同Windows版本之间的差异,你可以在Windows XP上成功运行Go程序。如果条件允许,升级到更高版本的Windows也是一个值得考虑的选项。