【发布时间】:2022-11-09 17:44:16
【问题描述】:
我收到了来自 dll 的回调, 函数 ptr 类型定义:
typedef int32_t (WINAPI *fn) ();
如果我使用 cgo,我们可以这样做:
/*
#include <windows.h>
#include <stdint.h>
typedef int32_t (WINAPI *fn) ();
int32_t call_callback(fn f){
f();
}
*/
import "C"
import (
"unsafe"
)
func main() {
var callBackPtr uintptr // from dll function
C.call_callback((C.fn)(unsafe.Pointer(callBackPtr)))
}
但!我不想用cgo。我怎样才能在纯围棋中实现?
【问题讨论】:
-
不要认为它会起作用。您可以使用简单的数据类型 args 从 go 调用 DLL 函数,而无需使用简单的数据类型 args,方法是使用
syscallarticle here 序列化它们;但是,我认为您不能(或不应该)能够使用 syscall 传递 go func 和 as c func 而无需 cgo。如果没有 cgo,Go 内存管理器可能也不会容忍这种情况 -
This issue 于 2013 年开业,表示“Cgo 的一个重点是首先做好这项工作”。最新的 cmets(this one 和 this one)指向两个存储库:POC 由第一条评论的作者提供,subproject of ebitengine