登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: syscall.NewCallback 与 syacall.NewCallbackCDecl 函数指针在 golang 中的实现     [回主站]     [分站链接]
标题
syscall.NewCallback 与 syacall.NewCallbackCDecl 函数指针在 golang 中的实现
clq
浏览(467) + 2023-01-29 09:31:31 发表 编辑

关键字:


syscall.NewCallback 与 syacall.NewCallbackCDecl 函数指针在 golang 中的实现

golang 的调用规则与 c 语言和 stdcall 的完全不同。所以它提供了封装自身函数为相应函数的方法(这个比较新颖,似乎没看到别的系统中有类似的东西)。
这样做的好处是在处理 dll/so 库时可以用纯 go 而不是上 cgo 。

https://vimsky.com/zh-tw/examples/detail/golang-ex-syscall---NewCallback-function.html
https://www.cnblogs.com/linga/p/13589981.html
https://www.cnblogs.com/lvdongjie/p/6507181.html

"
其中,第一个函数接收一个Go函数(这个Go函数的返回值必须只有一个,而且类型为uintptr),并生成一个__stdcall调用约定的C函数,并将生成的函数的地址以uintptr的形式返回;第二个函数的作用与之类似,但生成的函数的调用约定是__cdecl。

一个值得注意的问题是:C的指向函数的指针在Go中被视为*[0]byte,所以要转换一下才能用
"

```

Go获取Windows下的窗口
Go调用Windows下的DLL

package main

import (
"fmt"
"syscall"
"unsafe"
)

var (
kernel32DLL = syscall.MustLoadDLL("User32.dll")
procEnumWindows = kernel32DLL.MustFindProc("EnumWindows")
)

func StringToCharPtr(str string) *uint8 {
chars := append([]byte(str), 0)
return &chars[0]
}

// 回调函数,用于EnumWindows中的回调函数,第一个参数是hWnd,第二个是自定义穿的参数
func AddElementFunc(hWnd syscall.Handle, hWndList *[]syscall.Handle) uintptr {
*hWndList = append(*hWndList, hWnd)
return 1
}

// 获取桌面下的所有窗口句柄,包括没有Windows标题的或者是窗口的。
func GetDesktopWindowHWND() {
var hWndList []syscall.Handle
hL := &hWndList
r1, _, err := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(syscall.NewCallback(AddElementFunc)), uintptr(unsafe.Pointer(hL)), 0)
if err != 0 {
fmt.Println(err)
}
fmt.Println(r1)
fmt.Println(hWndList)
}

func main() {
GetDesktopWindowHWND()
}

关于syscall.Syscall中,第一个参数是DLL加载进来函数的指针,第二个是参数的个数,后边三个是参数,没有的话用0代替,其他几个同理。


```

下面的这个值得看一下

```
https://github.com/mattn/gyagowin

示例1: MyRegisterClass

func MyRegisterClass(hInstance winapi.HINSTANCE) winapi.ATOM {
var wc winapi.WNDCLASSEX

wc.CbSize = uint32(unsafe.Sizeof(winapi.WNDCLASSEX{}))
wc.Style = 0
wc.LpfnWndProc = syscall.NewCallback(WndProc)
wc.CbClsExtra = 0
wc.CbWndExtra = 0
wc.HInstance = hInstance
wc.HIcon = winapi.LoadIcon(hInstance, winapi.MAKEINTRESOURCE(132))
wc.HCursor = winapi.LoadCursor(0, winapi.MAKEINTRESOURCE(winapi.IDC_CROSS))
wc.HbrBackground = 0
wc.LpszMenuName = nil
wc.LpszClassName, _ = syscall.UTF16PtrFromString("GYAZOWIN")

winapi.RegisterClassEx(&wc)

var lwc winapi.WNDCLASSEX
lwc.CbSize = uint32(unsafe.Sizeof(winapi.WNDCLASSEX{}))
lwc.Style = winapi.CS_HREDRAW | winapi.CS_VREDRAW
lwc.LpfnWndProc = syscall.NewCallback(LayerWndProc)
lwc.CbClsExtra = 0
lwc.CbWndExtra = 0
lwc.HInstance = hInstance
lwc.HIcon = winapi.LoadIcon(hInstance, winapi.MAKEINTRESOURCE(132))
lwc.HCursor = winapi.LoadCursor(0, winapi.MAKEINTRESOURCE(winapi.IDC_CROSS))
lwc.HbrBackground = winapi.HBRUSH(winapi.GetStockObject(winapi.WHITE_BRUSH))
lwc.LpszMenuName = nil
lwc.LpszClassName, _ = syscall.UTF16PtrFromString("GYAZOWINL")

return winapi.RegisterClassEx(&lwc)
}

開發者ID:mattn,項目名稱:gyagowin,代碼行數:32,代碼來源:main.go

```






总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1