Golang Go语言中C++ GUI程序如何调用生成的DLL
Golang Go语言中C++ GUI程序如何调用生成的DLL
只针对 Windows, 我把 brook 编译成 dll 给我的 C++写的 GUI 程序调用,Golang 编译成 dll 没有什么问题。C++也能调用。
但是如果我 C++程序选择使用使用窗口,不用控制台模式,调用就不行了。如何修改 brook,让他被 GUI 程序调用。
调用不行是什么意思?
加载 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语言交互的方式。以下是一个基本的步骤指南:
-
确保DLL正确导出函数:在C++代码中,使用
extern "C"
来避免C++名称修饰,确保函数名在DLL中保持一致。例如:extern "C" __declspec(dllexport) void myFunction() { // 函数实现 }
-
编写Go接口代码:使用cgo语法在Go代码中声明并调用DLL中的函数。首先,创建一个包含C头文件声明的
.h
文件,然后在Go代码中通过// #include "your_header.h"
引入它,并使用//import "C"
来访问C语言的接口。 -
加载DLL:在Go中使用
syscall.LoadLibrary
或C.dlopen
(在类Unix系统上)来加载DLL。然后,使用syscall.GetProcAddress
或cgo的符号直接访问来获取函数指针。 -
调用函数:一旦获取了函数指针,可以将其转换为适当的Go函数类型,并进行调用。
-
处理错误:在加载DLL和调用函数时,务必检查错误并适当处理。
请注意,由于Go和C++的内存管理机制不同,传递复杂数据结构(如类或结构体)时可能需要额外的注意,以避免内存泄漏或数据损坏。此外,考虑到跨平台兼容性,DLL的加载和调用方式在不同操作系统上可能有所不同。