Golang语言 syscall 例子

时间:2022-05-05
本文章向大家介绍Golang语言 syscall 例子,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

获取Windows的系统默认目录

Windows系统目录函数请参考MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx

package mainimport (    "fmt"
    "syscall"
    "unsafe")var (
    shell         = syscall.MustLoadDLL("Shell32.dll")
    getFolderPath = shell.MustFindProc("SHGetFolderPathW")
)const (
    CSIDL_DESKTOP = 0   //用户桌面默认目录
    CSIDL_APPDATA = 26  //用户AppData目录)func main() {
    b := make([]uint16, syscall.MAX_PATH)    // https://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx
    // 这里第二个参数CSIDL_A必须定义为const,否则编译报错
    r, _, err := getFolderPath.Call(0, CSIDL_DESKTOP, 0, 0, uintptr(unsafe.Pointer(&b[0])))    if uint32(r) != 0 {
        fmt.Sprintf("获取DIR错误:", err)
    }
    a_dir := syscall.UTF16ToString(b)

    r, _, err = getFolderPath.Call(0, CSIDL_APPDATA, 0, 0, uintptr(unsafe.Pointer(&b[0])))    if uint32(r) != 0 {
        fmt.Sprintf("获取DIR错误:", err)
    }
    b_dir := syscall.UTF16ToString(b)

    fmt.Printf("目录ID:%d  目录地址:%sn", CSIDL_DESKTOP, a_dir)
    fmt.Printf("目录ID:%d  目录地址:%sn", CSIDL_APPDATA, b_dir)
}

SHGetFolderPathW的第二个参数必须定义为const,否则编译不过

输出

目录ID:0  目录地址:C:UserskuuyeeDesktop
目录ID:26  目录地址:C:UserskuuyeeAppDataRoaming