April 15, 2012

使用 Go 调用 Windows API

Go 通过 cgo 可以利用现有C语言库

例如在 Windows 中使用 Go 调用 Win32 API

首先安装必要的工具

  1. Go
  2. MingW
%GOPATH%
    +- src
        +- w32api
            +- kernel.go
        +- testapp
            +- main.go
    +- bin # go install testapp
        +- testapp.exe
    +- pkg # go install w32api
        +- windows_386
    +- testapp.exe

包装 Windows API

package w32api

// #define WIN32_LEAN_AND_MEAN
// #include <windows.h>
import "C"
import "syscall"

func GetCurrentDirectory() string {
    if bufLen := C.GetCurrentDirectoryW(0, nil); bufLen != 0 {
            buf := make([]uint16, bufLen)
            if bufLen := C.GetCurrentDirectoryW(bufLen, (*C.WCHAR)(&buf[0])); bufLen != 0 {
                        return syscall.UTF16ToString(buf)
            }
        }
    return ""
}

*注意*:

在 import “C” 和 // #include 之间不能有空行

编译并安装

go build w32api
go install w32api

调用

package main

import "w32api"

func main() {
    println(w32api.GetCurrentDirectory())
}
go build testapp
go install testapp

###Troubleshooting * can’t load package: package w32api: import “w32api”: cannot find package

原因是没有设置环境变量 GOPATH

原因是 gcc 所在目录没有加入道 %PATH% 中,检查 MingW 是否正确安装,并将 bin 目录加入到环境变量 %PATH% 中

###参考 使用CGO封装Windows API

comments powered by Disqus

© Copyright 2019 Tairan Wang