Golang Go语言中调用C++ DLL如何取得返回值

发布于 1周前 作者 zlyuanteng 来自 Go语言

Golang Go语言中调用C++ DLL如何取得返回值

以下是 c++的方法,其中 iResult 是可以返回的,我该如何传入和取出? CreateITapTradeAPI(const ITapTrade::TapAPIApplicationInfo *appInfo, ITapTrade::TAPIINT32 &iResult);

我现在的写法: vref2 := 0 var ref2 = uintptr(unsafe.Pointer(&vref2) ret, b, err := funcresult.Call(ref1, ref2)

没有报错,但不知道如何取得 传出的值

这样试过,好像不对 presult := (*byte)(unsafe.Pointer(ref2)) if (presult != nil) { data := make([]byte, 0)

for *presult != 0 { data = append(data, *presult) ref2 += unsafe.Sizeof(byte(0)) presult = (*byte)(unsafe.Pointer(ref2))

resultcode := binary.BigEndian.Uint32(data) //bytesBuffer := bytes.NewBuffer(data) //var tmp int32 //binary.Read(bytesBuffer, binary.BigEndian, &tmp) println(resultcode) }


更多关于Golang Go语言中调用C++ DLL如何取得返回值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

C++ 的导出函数一般不能跨语言调用吧,要调用的话需要包装成 C 的函数。

更多关于Golang Go语言中调用C++ DLL如何取得返回值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果 golang 不支持,那么写个 c#调用然后暴露成 webapi ?曲线救国

可以的。我试了另一个无参数的,就可以取得返回值,只不过他不是引用参数

可以了,取错值了,它直接把 vref2 这个变量改了。

简单的没有问题
现在第一个参数不知道怎么传了,怎么传都不对。C++本身没有问题,Demo 可以跑

第一个参数是 *appInfo
第二个参数是 &iResult

在Golang中调用C++编写的DLL并获取返回值,通常涉及使用cgo工具来桥接Go和C语言,然后通过C语言接口调用C++的DLL。以下是一个简要的步骤说明:

  1. 编写C++ DLL:首先确保你的C++代码已编译为DLL,并导出所需函数。使用extern "C"来避免C++名称修饰,确保函数名在DLL中可见。

  2. 创建C接口:编写一个C语言头文件(.h)和实现文件(.c),在C接口中声明和定义调用C++ DLL的函数。这一步是为了确保Go代码可以通过纯C接口与C++ DLL交互。

  3. 使用cgo:在Go代码中,通过// #cgo指令引入C头文件,并使用import "C"来访问C接口。在Go函数中,使用C.函数名来调用C接口中的函数,从而间接调用C++ DLL。

  4. 处理返回值:C++ DLL的返回值类型和Go的类型需要适当转换。例如,如果C++函数返回一个整数,C接口和Go代码中都应该声明为int类型。对于复杂类型,如结构体或指针,需要更复杂的转换逻辑。

  5. 编译和运行:确保Go编译器能找到C和C++的头文件及DLL文件,然后编译Go程序。运行时,确保DLL文件在系统的PATH中,或者通过其他方式指定DLL路径。

请注意,由于Go和C++的内存管理机制不同,处理指针和动态内存分配时要特别小心,以避免内存泄漏或崩溃。

回到顶部