CGO 之 Dll调用

news/2024/10/30 23:21:14/


生成的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 句柄}






http://www.ppmy.cn/news/281023.html

相关文章

还原卡大全

来源&#xff1a;http://www.dt0755.net/dt0755/show.asp?ArticleID209 【软件还原】 一键还原类 包括&#xff1a;F10一键还原&#xff0c;F11一键还原精灵&#xff0c;深度一键还原&#xff0c;一键网克&#xff0c;以及品牌机的一键还原&#xff08;复活&#xff0…

迅闪2007 正式版 Build 0703 发布(去广告、修正还原问题)

自《迅闪 2007 正式版》发布后&#xff0c;得到了广大迅闪用户的支持&#xff0c;同时也提出了合理的意见和建议&#xff0c;迅闪项目组根据用户的提议对迅闪的广告和还原的BUG进行了调整&#xff0c;现经迅闪三个交流群近百家网吧的测试和使用后&#xff0c;反应效果良好。《迅…

优漫动游:有人说UI设计培训四个月骗局,是真的吗?

在当前数字化时代&#xff0c;UI设计行业变得越来越受欢迎。越来越多的人开始对这个职业感兴趣&#xff0c;并参加相应的培训课程以提高自己的技能水平。然而&#xff0c;近期有关于UI设计培训四个月的负面评论&#xff0c;称其为骗局。那么&#xff0c;有人说UI设计培训四个月…

可终身使用的会员邮箱靓号,到底有多酷?

要说2020年什么最火&#xff0c;乘风破浪的姐姐&#xff1f;30而已&#xff1f;秋天的第一杯奶茶&#xff1f;还有一个定不能错过&#xff0c;一个终身使用的会员邮箱。靓号在手到底有多酷&#xff0c;低调的身份感&#xff0c;丝毫不亚于爱马仕在手、Chanel在身&#xff0c;回…

晨哥真有料丨女生眼中的高级感!

哈喽,大家好, 我是严厉不温柔、专说大实话的晨哥 我得问问有些人啊,为什么你明明有异性资源,还非得巴巴上赶着做舔狗? 为什么你明明挺优秀啊,还非上赶着伤春悲秋。 说你看看其他那些歌,身边都是倒霉蛋、铁憨憨的那些小老弟们,他可羡慕死你了 他要有你这条件…

超简单:很火的3D立体动态相册,送给心爱的那个人

1.首先&#xff0c;我们一共需要三个文件&#xff0c;目录关系如下所示。先建index.html文件吧&#xff0c;电脑上先创建一个.txt文件&#xff0c;在里面加入代码后保存&#xff0c;重命名为index.html(记得把原来的.txt后缀覆盖&#xff09;。html我用的谷歌浏览器。 index.h…

Pubwin 2007有奖“找茬”计划

Pubwin 2007在研发过程中吸取了广大网管的建议&#xff0c;软件质量有了很大的提高&#xff0c;为长期保证Pubwin 2007的品质&#xff0c;新浩艺公司现推出Pubwin 2007有奖“找茬”计划&#xff0c;即从2007年6月14日发布的Pubwin2007 版本起&#xff08;只包括正式发布的版本&…

炫酷的展示画册制作神器,你确定不心动吗 | 万彩动画大师

区别于传统销售人员带着PPT的冗长讲解&#xff0c;新型产品营销方式以创意动画视频为宣传途径&#xff0c;通过简短的视频介绍&#xff0c;生动有趣的动态画面&#xff0c;轻松地表达产品的特色和功能。那么&#xff0c;好看的产品展示动画制作难做吗&#xff1f;要找动画公司制…