Golang Go语言中C++ GUI程序如何调用生成的DLL

Golang Go语言中C++ GUI程序如何调用生成的DLL

只针对 Windows, 我把 brook 编译成 dll 给我的 C++写的 GUI 程序调用,Golang 编译成 dll 没有什么问题。C++也能调用。

但是如果我 C++程序选择使用使用窗口,不用控制台模式,调用就不行了。如何修改 brook,让他被 GUI 程序调用。

7 回复

调用不行是什么意思?
加载 DLL 的方式是静态链接还是动态地 LoadLibrary ?
编译、链接还是运行时有问题?有没有错误代码或提示?

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


静态编译不行吗?
可以先用 dumpbin 看下依赖

动态。
运行时,运行到 dll 的函数里里面,直接整个程序退出了。没有错误提示。

运行期库可能不对,调试器可以捕获具体情况

另外不要导出这种 string 的函数,因为存在内存在不同运行期释放的问题,就裸内存传

估计是崩了,不要跨模块传递 string、STL 容器之类的对象,一旦涉及内存分配或释放就会崩掉了。

在Golang(Go语言)中调用由C++编写的GUI程序生成的DLL(动态链接库),通常涉及使用cgo工具,这是Go语言提供的一种与C语言交互的方式。以下是一个基本的步骤指南:

  1. 确保DLL正确导出函数:在C++代码中,使用extern "C"来避免C++名称修饰,确保函数名在DLL中保持一致。例如:

    extern "C" __declspec(dllexport) void myFunction() {
        // 函数实现
    }
    
  2. 编写Go接口代码:使用cgo语法在Go代码中声明并调用DLL中的函数。首先,创建一个包含C头文件声明的.h文件,然后在Go代码中通过// #include "your_header.h"引入它,并使用//import "C"来访问C语言的接口。

  3. 加载DLL:在Go中使用syscall.LoadLibraryC.dlopen(在类Unix系统上)来加载DLL。然后,使用syscall.GetProcAddress或cgo的符号直接访问来获取函数指针。

  4. 调用函数:一旦获取了函数指针,可以将其转换为适当的Go函数类型,并进行调用。

  5. 处理错误:在加载DLL和调用函数时,务必检查错误并适当处理。

请注意,由于Go和C++的内存管理机制不同,传递复杂数据结构(如类或结构体)时可能需要额外的注意,以避免内存泄漏或数据损坏。此外,考虑到跨平台兼容性,DLL的加载和调用方式在不同操作系统上可能有所不同。

回到顶部