CGO 之 Dll调用
生成的dll库代码
// GoDll.cpp : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"
#include <iostream>
#include <cstdint>void __stdcall void_R0()
{std::cout << __FUNCTION__ << std::endl;
}void __stdcall void_R1(const char* name)
{std::cout << __FUNCTION__ << " ----> " << name << std::endl;
}void __stdcall void_R2(const char*name ,char **outName)
{std::string _name = "HintSoft 新浩艺-";_name += name;strcpy(*outName,_name.c_str());
}uint8_t __stdcall uint8_R1(char** outJson)
{*outJson = new char[256];memset(*outJson,0,256);strcpy(*outJson,"Hello -> 你被骗了,这里没有Json,只有中文");return 1;
}void __stdcall uint8_R1_free(char** outJson)
{if(outJson == 0) return;if(*outJson == 0) return;delete [](*outJson);*outJson = nullptr;
}typedef void (*CallBackFunType)(const char * in);
void setCallBackFun(CallBackFunType func)
{if(!func){std::cout << __FUNCTION__ << " NULL ptr" << std::endl;}func("hello CallBackFuncType ---- setCallBackFun");
}
导出函数def
EXPORTS
void_R0 @1
void_R1 @2
void_R2 @3
uint8_R1 @4
uint8_R1_free @5
setCallBackFun @6
go调用测试
package mainimport ("fmt""syscall""unsafe"
)/*
#include <stdio.h> // 如果要调用C.free 一定要在些包含对应的头文件
#include <stdlib.h>// 以下两种方式任选其一
void CallBackFun( char* in);
//void CallBackFun( char* in)
//{
// printf("%s\r\n",in);
//}*/
import "C"// export 必须要
//export CallBackFun
func CallBackFun(in *C.char) {fmt.Print(C.GoString(in))
}func main() {fmt.Println("---------------------------------------------------------------")handle, err := syscall.LoadDLL("GoDll.dll")if err != nil {fmt.Println(err.Error())return}fmt.Println(handle.Handle)fmt.Println(handle.Name)void_R0, err := handle.FindProc("void_R0")if err != nil {fmt.Println("void_R0 不存在", err.Error())return}void_R1, err := handle.FindProc("void_R1")if err != nil {fmt.Println("void_R1 不存在", err.Error())return}void_R2, err := handle.FindProc("void_R2")if err != nil {fmt.Println("void_R2 不存在", err.Error())return}uint8_R1, err := handle.FindProc("uint8_R1")if err != nil {fmt.Println("uint8_R1 不存在", err.Error())return}uint8_R1_free, err := handle.FindProc("uint8_R1_free")if err != nil {fmt.Println("uint8_R1_free 不存在", err.Error())return}setCallBackFun, err := handle.FindProc("setCallBackFun")if err != nil {fmt.Println("setCallBackFun 不存在", err.Error())return}fmt.Println("--------------------------函数加载成功-------------------------")// -------------------------------------------------------------------------fmt.Println("---- void_R0")fmt.Println(void_R0.Addr())void_R0.Call()// -------------------------------------------------------------------------fmt.Println("\r\n\r\n---- void_R1")fmt.Println(void_R1.Addr())name := C.CString("li_jian_xing")void_R1.Call((uintptr)(unsafe.Pointer(name)))C.free(unsafe.Pointer(name))// -------------------------------------------------------------------------// 创建数组,传入char** 取出C函数中的数据fmt.Println("\r\n\r\n---- void_R2")fmt.Println(void_R2.Addr())arg := make([]C.char, 1024)name = C.CString("li_jian_xing")void_R2.Call((uintptr)(unsafe.Pointer(name)), (uintptr)(unsafe.Pointer((&arg))))C.free(unsafe.Pointer(name))fmt.Println(C.GoString(&arg[0]))// -------------------------------------------------------------------------// 传入char** 取出C函数分配的内存,处理完再释放fmt.Println("\r\n\r\n---- uint8_R1")fmt.Println(uint8_R1.Addr())var argc *C.charuint8_R1.Call((uintptr)(unsafe.Pointer(&argc)))fmt.Println(C.GoString(argc))uint8_R1_free.Call((uintptr)(unsafe.Pointer(&argc)))// -------------------------------------------------------------------------// 向dll 函数设定回调fmt.Println("\r\n\r\n---- setCallBackFun")fmt.Println(setCallBackFun.Addr())setCallBackFun.Call((uintptr)(unsafe.Pointer(C.CallBackFun)))handle.Release() // 释放dll 句柄}
CGO 之 Dll调用相关推荐
- csharp通过dll调用opencv函数,图片作为参数
[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数 一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...
- python调用dll函数_关于从加载的DLL调用函数的Python基本问题
我是在搜索和尝试各种各样的例子后提出这个问题的,但我似乎无法从加载的DLL调用函数.我想如果有人能给我举一个例子,我就能理解我做错了什么,并取得一些进展.在 首先,使用Python 3.3.3可以加载 ...
- TSC条码打印机C#例程(tsclib.dll调用)
TSC条码打印机C#例程(tsclib.dll调用) //---- program.cs using System; using System.Collections.Generic; using ...
- opencv通过dll调用matlab函数,图片作为参数
[blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数 前文介绍了如何"csharp通过dll调用opencv函数,图片作为参数 ...
- Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework
Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework 该文章是一篇说明c++/Qt调用 ...
- 新中新二代身份证dll调用,报尝试读取或写入受保护的内存,这通常指示其他内存已损坏 这个错 ...
新中新二代身份证dll调用问题:调用这个dll时, 到这个方法: Syn_ReadMsg(nPort, 0, ref CardMsg),就报尝试读取或写入受保护的内存.这通常指示其他内存已损坏 这个错 ...
- 如何查看exe或dll调用了什么dll
[转载]如何查看exe或dll调用了什么dll呢 已有 19410 次阅读 2014-4-17 21:08|系统分类:科研笔记|文章来源:转载 Dependency Walker使用说明 在Windo ...
- 解决opencv自定义dll 调用时找不到 opencv_world400d的pdb文件的问题
解决opencv自定义dll 调用时找不到 opencv_world400d的pdb文件的问题 本文章将解决以下几个问题 其中报错包括 OpenCV(4.0.0) Error: Assertion f ...
- c语言中ntdll.dll,在Win32环境中从ntdll.dll调用Nt函数,C
我想从ntdll.dll调用一些Nt函数,我就是这样做的. 对于调用:NtTestAlert(),您需要典型的ntcall内核例程,可通过int 2Eh访问. (从这里我得到Nt功能http://un ...
- PowerShell-4.API调用以及DLL调用
PowerShell可以直接调用API,So...这东西完全和cmd不是一回事了... 调用API的时候几乎和C#一样(注意堆栈平衡): 调用MessageBox: $iii = Add-Type - ...
最新文章
- 让学生网络相互学习,为什么深度相互学习优于传统蒸馏模型?| 论文精读
- $digest already in progress 解决办法——续
- Mac OS X 10.8.5 安装编译glib
- kubernetes不同的命名空间下的容器能通信吗_超长干货 | Kubernetes命名空间详解
- 【django】配置URLconf
- 输出200-299之间的所有素数
- Ubuntu安装Navicat正版永久使用方法
- 让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化
- 使用优化的基于模糊规则的特征选择技术和基于树的集成方法进行山洪敏感性建模--文献阅读
- Canvas实战---模仿GOOGLE浮动小球效果
- 在XNA 3.0 项目添加声音——播放MP3或WMA声音文件
- 什么是随机存取存储器
- DB2 sql报错后查证原因与解决问题的方法
- 利用PPT要怎样绘制正弦曲线
- vue结合elementui实现输入框输入关键词显示下拉列表点击列表中关键字页面滚动到关键字所在位置
- [labview]做一个简单实用可扩展功能的高速串口发送(接收)调试器
- 零基础学DevOps必看教程,带你10分钟快速实战入门DevOps
- QCon全球软件开发大会(北京站)将于4月25日开幕
- 全家都是博士是一种什么样的体验?
- 淘宝一月上钻是这样操作的