gpt4 book ai didi

go - 如何使用最少的 Cgo 为 DLL 使用 Go 回调?

转载 作者:IT王子 更新时间:2023-10-29 02:21:57 33 4
gpt4 key购买 nike

设置回调函数以传递给 DLL 函数的参数的一种方法是使用 CGO...

package main

/*
#cgo LDFLAGS: -L${SRCDIR} -lsomelib

#include "somelib.h"

extern void CallbackString(char* s);
*/
import "C"

import (
"unsafe"
"fmt"
)

//export CallbackString
func CallbackString(s *C.char) {
gostr := C.GoString(s) // convert to golang string
fmt.Println("Got string from dll (or dso): ", gostr)
}

func Example() {
// setup a callback by calling a function in
// the DLL requiring callback param
C.SomeDLLFunc(x,y,
(C.TCallbackString)(unsafe.Pointer(C.CallbackString)),
other,
params)
}


func main() {
Example()
}

回调定义为

typedef void (*TCallbackString)(char*);

但我想知道是否有一种方法可以避免使用 CGO 并只需将 go 函数作为参数传递而不需要不必要的 C 代码绑定(bind).. 即

C.SomeDLLFunc(x,y,
CallbackString, // how to send the go function in as a callback?
other,
params)

是否总是需要编写 C 绑定(bind)或任何你称之为的东西,C 链接到 go 代码,C exports/externs,以便将回调作为参数发送?

如果不先将它变成 C-ish,就没有办法让一个 go 函数成为一个回调吗?

C.SomeDLLFunc(x,y,
WhatCastIsNeeded(CallbackString), // regular go function as a callback?
other,
params)

最佳答案

有一些方法可以避免转换并简化回调代码。

// cgo.h in dll  
typedef void (*Callback)(int kind,void* arg);
void SetCallback(Callback func);

// cgo.c in dll
Callback Gfunc;
void SetCallback(Callback func){
Gfunc=func;
}

// cgocb.h in go project
void InitCallback();
extern void goCallbackFunction(int kind,void* arg);

// cgocb.c in go project
void InitCallback(){
SetCallback(goCallbackFunction);
}

// cgocb.go in go project
// export goCallbackFunction
func goCallbackFunction(kind C.int,arg unsafe.Pointer){
switch kind{
case C.AKind:
arg:=(*C.AKind)(arg)
AkindCallback(arg)
}
}
  1. C.InitCallback 函数类似于 C.SomeDLLFunc。但它直接引用 goCallbackFunction 而无需转换,因为我将代码从.去.c。
  2. 这是一个关于从c dll 回调的解决方案。我们只需要向 dll 注册一个 go 函数。我们写一个C.InitCallback。请注意,如果我们使用 C.SomeDLLFunc 解决方案,我们必须编写 (gocallback,dllfunc) 对。
  3. 在 c dll 中保留一个 export go 函数指针是可以的。

关于go - 如何使用最少的 Cgo 为 DLL 使用 Go 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44079364/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com