【问题标题】:execute a callback(via function ptr) from dll从 dll 执行回调(通过函数 ptr)
【发布时间】: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,方法是使用 syscall article here 序列化它们;但是,我认为您不能(或不应该)能够使用 syscall 传递 go func 和 as c func 而无需 cgo。如果没有 cgo,Go 内存管理器可能也不会容忍这种情况
  • This issue 于 2013 年开业,表示“Cgo 的一个重点是首先做好这项工作”。最新的 cmets(this onethis one)指向两个存储库:POC 由第一条评论的作者提供,subproject of ebitengine

标签: go dll cgo


【解决方案1】:

只是

   syscall.SyscallN(callBackPtr, [callBack's arg])

……

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多