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