小编Frn*_*Wdl的帖子

从 golang 到 c (cgo) 的 SetEvent 状态

我编写了 DLL 来处理我在 golang 中的 VSCAN 通信。我现在面临着一个非常棘手的问题。有没有办法将状态从 cgo 发送到 c/cpp 程序?

我正在使用一个大型 CPP 项目,在它内部调用外部 golang DLL(用 GCC 编译)。程序通过事件句柄:

    // this is a function from DLL (written in go). I want to pass the event handler there.
    VSCAN_STATUS VSCAN_SetRcvEvent(VSCAN_HANDLE Handle, HANDLE Event);

    // Calling it from c:
    sg_hEventRecv = CreateEvent(nullptr, FALSE, FALSE, nullptr);
    VSCAN_SetRcvEvent(1, sg_hEventRecv)
Run Code Online (Sandbox Code Playgroud)

我将传递的 HANDLER 存储在 go dll 中:

package test

import "C"

var event C.HANDLE
func signalState(){
C.SetEvent(event) 
}

//export VSCAN_SetRcvEvent
func VSCAN_SetRcvEvent(Handle VSCAN_HANDLE, Event C.HANDLE) int { …
Run Code Online (Sandbox Code Playgroud)

dll events go cgo

7
推荐指数
0
解决办法
104
查看次数

将字符串传递给Syscall(uintptr)

我需要在golang中将字符串作为参数传递给C DLL,我希望得到这样的结果:

  proc, e = syscall.GetProcAddress(h, "JLINKARM_ExecCommand") //One of the functions

    vals := []string{"device = STM32F429ZI"}
    start := uintptr(unsafe.Pointer(&vals[0]))

    asd, _, _ = syscall.Syscall6(uintptr(proc), 3, start, 0, 0, 0, 0, 0) 
Run Code Online (Sandbox Code Playgroud)

但它不起作用.Syscall采取param uintptr.我不能使用C包,因为它不会在Windows上构建.

在C中它的工作原理如下:

strcpy(acIn, "device = STM32F407IE");

JLINKARM_ExecCommand(acIn, &acOut[0], sizeof(acOut));
Run Code Online (Sandbox Code Playgroud)

那么C DLL是否可以获得字符串参数并正确使用它?

dll go

2
推荐指数
1
解决办法
665
查看次数

标签 统计

dll ×2

go ×2

cgo ×1

events ×1