|
分享源码
界面截图: |
|
是否带模块: |
调用了模块 |
备注说明: |
- |
本帖最后由 YeSilin 于 2021-1-24 03:51 编辑
使用golang写动态库,再使用易语言写界面,肯定有不少人有这种想法吧;但中间有些坑,这里留下一些解决方法。
一、如何编译?
-
请先安装gcc编译器,选择32位,下载地址:https://jmeubank.github.io/tdm-gcc/download/ ;
-
由于易语言只支持32位dll,使用64位会出错,例如找不到此函数;
-
必须先设置两项配置:set GOARCH=386 ,set CGO_ENABLED=1 ,用cmd;
-
编译命令:go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll dlldemo.go 。
二、形参与返回值
- 在go中,除了
string 特殊外,其他int 、bool ,等基本类型原本怎样还是怎样;
- 传
string 与返回值 string 都改成 *C.char 类型,其他基本类型不用改;
- 有三个方法比较重要,
C.CString 转成c字符串,C.GoString 转成go字符串 , C.free 释放内存;
- 只要用到
C.CString 此方法,就必须记得释放内存。
三、内存泄漏
- 如果使用了
C.CString 却不使用 C.free ,内存暂用只会越来越大,最后奔溃;
- 释放内存时,请不要重复取地址,例如
unsafe.Pointer(&xx变量) ,这样等于没释放;
- 也可能是vc6的原因,使用
defer 在即将出栈时释放,会造成易语言得不到返回值;
- 解决方法,声明全局变量,将结果赋值给全局变量,专门定义一个释放函数例如
FreeAll() 用于释放!
四、如何调用
- 在填写dll命令时,请在填写,在库中对应命令名时,前面加个
@ ,不然会出现栈错误;
- 每次调用返回值是文本型dll命令时,请都使用前面准备的
FreeAll() 释放内存!
- 通过易语言的便捷,为自己的golang小项目加点gui吧,这里留下源码,给有需要的人。
golang编译dll给易语言.7z
(1007.37 KB, 下载次数: 246)
|
评分
-
参与人数 4 | 好评 +4 |
精币 +2 |
收起
理由
|
nuan1989
| + 1 |
|
有没e转go的学习群, 拉我个, qq 703973110 |
荖貢
| + 1 |
|
让我说,返回非整数类型的数值,就是在误导小白或本身就是小白,建议是想获取什么数据,传. |
zlw310282
| + 1 |
+ 2 |
感谢分享,很给力!~ |
1301ok
| + 1 |
|
感谢发布原创作品,一定好好学习,天天向上 |
查看全部评分
|