go 调用dll char*传输
参考:http://www.voidcn.com/article/p-ofnbgvoa-bpv.html
https://stackoverflow.com/questions/53721215/syscall-mustloaddll-mustfindproc-throws-the-specified-procedure-could-not-be-fo
c++:
MYLIBDLL char* testchar(int plus1);
MYLIBDLL void greet(char *name);
void greet(char *name)
{printf("Hello, %s!\n", name);
}
char* testchar(int plus1) {char* str = "hello world111111";return str;
}
main.go代码:
package mainimport ("syscall""unsafe""fmt"
)
import "C"func callDll() {dll := syscall.MustLoadDLL("hik_client.dll")procGreet := dll.MustFindProc("greet")procGreet.Call(uintptr(unsafe.Pointer(syscall.StringBytePtr("Cynhard11"))))procName := dll.MustFindProc("testchar")r, _, _ := procName.Call(1)// 获取C返回的指针。// 注意C返回的r为char*,对应的Go类型为*bytep := (*byte)(unsafe.Pointer(r))// 定义一个[]byte切片,用来存储C返回的字符串data := make([]byte, 0)// 遍历C返回的char指针,直到 '\0' 为止for *p != 0 {data = append(data, *p) // 将得到的byte追加到末尾r += unsafe.Sizeof(byte(0)) // 移动指针,指向下一个charp = (*byte)(unsafe.Pointer(r)) // 获取指针的值,此时指针已经指向下一个char}name := string(data) // 将data转换为字符串fmt.Printf("Hello, %s!\n", name)//var a = make([]byte, 256)//////dll32 := syscall.NewLazyDLL("hik_client.dll")//fmt.Println("call dll:", dll32.Name)//GetPeopleName := dll32.NewProc("testchar")////ret,_,err := GetPeopleName.Call(uintptr(unsafe.Pointer(&a)),2)//if err != nil {// fmt.Println(ret,a)// aaa := C.GoString(ret)// //C.free(unsafe.Pointer(cs))// //C.free(unsafe.Pointer(result))// //fmt.Println(aaa,a)//}//result, a, _ := g.Call(4)//fmt.Println("result is :", ret)
}func main() {fmt.Println("start111111111!")callDll()//fmt.Println(C.add(2, 1))
}
go 调用dll char*传输相关推荐
- C#调用dll中的函数
C#调用dll中的函数 文章分类:操作系统 文章来源:http://blog.csdn.net/strmagic/archive/2007/11/02/1863462.aspx 大家在实际工作学习C# ...
- C++ Builder创建和调用dll中的资源
程序开发中经常会用到一些图标.图片.光标.声音等,我们称它们为资源(Resource).当多个窗口用到同样的资源时,可以将这些公共的资源放到一个dll文件里调用,这样,由于定位资源比在磁盘中定位文件花 ...
- java中通过JNA调用dll
---恢复内容开始--- 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进 ...
- gcc生成dll linux,gcc编译dll和调用dll
方法一: 共有三个文件:print.h,print.c,test.c *************************************************************** p ...
- Qt调用dll中的功能函数
http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html 声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll ...
- delphi 调用dll 整形返回值_VS2015 编写C++ DLL库及C++、 C#、python 调用
VS2015生成c++dll C++ 程序调用 dll C# 程序调用 dll 1. VS2015 生成C++dll 可以有两种方法 通过_declspec(dllexport) extern &qu ...
- QT 调用 DLL 的三种方法
Qt调用DLL方法一:使用Win32 API h文件 typedef bool (CALLBACK* SetKeyBoardHook)(HWND); HINSTANCE hDLL; // Handle ...
- 如何调用 DLL 中的函数
如何调用 DLL 中的函数 在 DLL工程中的 cpp中函数定义如下: extern "C" _declspec (dllexport ) int add(int a, ch ...
- 使用extern C改善显式调用dll
extern "C"的简单解析 我们前面介绍了显式调用dll的方法,例如 http://www.cnblogs.com/laogao/archive/2012 ...
最新文章
- dedecms首页如何调用专题页描述和链接
- 【CF526F】Pudding Monsters
- linux 查询线程是否结束_批量随机键值查询测试
- 外服封号_外服大主播Diss原神:因为吐槽氪金体验差,米哈游把我号封了
- 《鸟哥的Linux私房菜--基础篇》学习
- java inner static_Java SE Static Inner
- linux 查看共享磁盘_如何可视化地查看 Linux 系统磁盘使用情况?
- python线程暂停_在python中暂停一个线程和另一个线程
- 机器学习,总是不得其法,问题出在哪里?
- 找不到该项目,请确认该项目的位置的办法(转)
- HyBrid App框架介绍
- 在Cocos2d-x中使用CocosBuilder
- 教你解决PC微信“版本过低”无法登陆的问题
- 虚拟软盘启动OS方法
- 支持SwiftUI!Swift版图片视频浏览器-JFHeroBrowser上线啦
- matlab在solver,matlab的solver
- Java常用类--日期时间相关的类
- HTML技能点--设置网页图标标志
- Selenium 爬取评论数据,就是这么简单!
- EDI在汽车行业的应用
热门文章
- Android中堆unlink利用学习
- insight-vmi 编译中的问题
- 开机秒全国99%电脑 实战UEFI安装Win8
- android 自定义event,Android运用onTouchEvent自定义滑动布局
- 专题 7 设备文件编程
- 嵌套 思维导图_工作小Tips:如何用思维导图来整理你的汇报
- python监控错误语句,基于Python的关键字监控及告警
- win10系统启动服务器不可用,解决win10专业版windows installer服务不可用不能启动更不能访问...
- 形态学边缘提取matlab,在Matlab平台下基于形态学方法对LIDAR数据进行建筑物边缘提取...
- bool变量取反_Task 01:Python基础入门:从变量到异常处理(第1天)