我是靠谱客的博主 痴情信封,最近开发中收集的这篇文章主要介绍go 调用winapi_调用Windows API函数(stdcall)的符号扩展规则是什么?这需要从Go调用WInAPI,这对int类型是严格的...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

@ twotwotwo对我的问题的评论指出了我正确的方向.如果Stack Overflow允许将注释标记为答案并标记多个答案,那么我会这样做.

tl; dr版本:毕竟我现在拥有的是正确的.

我编写了一个程序(下面),简单地从包syscall中转储所有常量,并查找负数但不是== -1的常量(因为它只是^ 0).标准文件句柄(STD_ERROR_HANDLE,STD_INPUT_HANDLE和STD_OUTPUT_HANDLE)分别为(-12,-10和-11).包syscall中的代码将这些常量作为getStdHandle(h int)的唯一参数传递,它为包os生成所需的文件句柄. getStdHandle()将此int传递给自动生成的函数GetStdHandle(stdhandle int),该函数包装对GetStdHandle()系统调用的调用. GetStdHandle()获取int并仅将其转换为uintptr以传入syscall.Syscall().虽然自动生成器的源代码(mksyscall_windows.go)没有给出解释,如果这不起作用,fmt.Println()= P也不会

所有上述内容在windows / 386和windows / amd64上都是相同的;处理器特定文件中唯一的东西是GetStdHandle(),但相关代码是相同的.

我的negConst()函数已经做了同样的事情,只是更直接.因此,我可以放心地认为它是正确的.

谢谢!

// 4 june 2014

// based on code from 24 may 2014

package main

import (

"fmt"

"os"

"strings"

"go/token"

"go/ast"

"go/parser"

"code.google.com/p/go.tools/go/types"

_ "code.google.com/p/go.tools/go/gcimporter"

)

var arch string

func getPackage(path string) (typespkg *types.Package, pkginfo types.Info) {

var pkg *ast.Package

fileset := token.NewFileSet() // parser.ParseDir() actually writes to this; not sure why it doesn't return one instead

filter := func(i os.FileInfo) bool {

if strings.Contains(i.Name(), "_windows") &&

strings.Contains(i.Name(), "_" + arch) &&

strings.HasSuffix(i.Name(), ".go") {

return true

}

if i.Name() == "race.go" || // skip these

i.Name() == "flock.go" {

return false

}

return strings.HasSuffix(i.Name(), "_windows.go") ||

(!strings.Contains(i.Name(), "_"))

}

pkgs, err := parser.ParseDir(fileset, path, filter, parser.AllErrors)

if err != nil {

panic(err)

}

for k, _ := range pkgs { // get the sole key

if pkgs[k].Name == "syscall" {

pkg = pkgs[k]

break

}

}

if pkg == nil {

panic("package syscall not found")

}

// we can't pass pkg.Files directly to types.Check() because the former is a map and the latter is a slice

ff := make([]*ast.File, 0, len(pkg.Files))

for _, v := range pkg.Files {

ff = append(ff, v)

}

// if we don't make() each map, package types won't fill the structure

pkginfo.Defs = make(map[*ast.Ident]types.Object)

pkginfo.Scopes = make(map[ast.Node]*types.Scope)

typespkg, err = new(types.Config).Check(path, fileset, ff, &pkginfo)

if err != nil {

panic(err)

}

return typespkg, pkginfo

}

func main() {

pkgpath := "/home/pietro/go/src/pkg/syscall"

arch = os.Args[1]

pkg, _ := getPackage(pkgpath)

scope := pkg.Scope()

for _, name := range scope.Names() {

obj := scope.Lookup(name)

if obj == nil {

panic(fmt.Errorf("nil object %q from scope %v", name, scope))

}

if !obj.Exported() { // exported names only

continue

}

if _, ok := obj.(*types.Const); ok {

fmt.Printf("egrep -rh '#define[ ]+%s' ~/winshare/Include/ 2>/dev/nulln", obj.Name())

}

// otherwise skip

}

}

最后

以上就是痴情信封为你收集整理的go 调用winapi_调用Windows API函数(stdcall)的符号扩展规则是什么?这需要从Go调用WInAPI,这对int类型是严格的...的全部内容,希望文章能够帮你解决go 调用winapi_调用Windows API函数(stdcall)的符号扩展规则是什么?这需要从Go调用WInAPI,这对int类型是严格的...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部