最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一、DLL 的编制与具体的编程语言及编译器无关

dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以调用,但com分很多种。比如而php只能调用com的dll的特定的几种、不能直接调用动态dll,要使用第三方的dll文件dynwrap.dll或者编译PHP扩展来迂回调用动态dll:只要遵循约定的 DLL 接口规范和调用方式,用各种语言编写的 DLL 都可以相互调用。譬如 Windows 提供的系统 DLL (其中包括了 Windows 的 API ),在任何开发环境中都能被调用,不在乎其是 Visual Basic 、 Visual C++ 还是 Delphi
二、动态dll文件里面需要被其他程序访问的函数必须导出,有2种方法(c++,其他语言不清楚)源文件如下:DllTestDef.h
#ifndef DLLTESTDEF_H#define DLLTESTDEF_Hint  add(int x, int y);#endif

DllTestDef.cpp
#include "DllTestDef.h"int  add(int x, int y){return x + y;}

2.1、通过在.h头文件里面为函数添加 __declspec(dllexport),例如:
_declspec(dllexport) int add(int a, int b);
说明:此方式下,如果调用该dll的是一个c++程序(同一个编译器的版本)是没有问题的。但是如果是一个其它语言的程序(如C#、VB),则会出错
因为VC++编译器对于__declspec(dllexport)声明的函数会进行名称转换,如上面的函数会转换为Add@0,这样你在VB中必须这样声明:
Declare Function Add Lib "DLLTestDef.dll" Alias "Add@0" () As Long
@后面的数由于参数类型不同而可能不同。这显然不太方便。
为了解决这一问题,我们往往在函数前面再加一个extern "C",使用C方式的函数命名规则。所以为了大范围的使用我们基本申明都如下:
extern "C" _declspec(dllexport) int add(int a, int b);
DllTestDef.h
#ifndef DLLTESTDEF_H#define DLLTESTDEF_Hextern "C"  __declspec(dllexport) int  add(int x, int y);#endif

DllTestDef.cpp同源文件
2.2、使用.def文件,为了简化2.1的那一长串代码,MS引入了def文件方便我们操作。
DllTestDef.h同源文件
DllTestDef.cpp同源文件
DllTestDef.def
LIBRARY DllTestDef
EXPORTS
add @ 1
;导出其中的add函数,并指定add函数的序号为1
;sub @ 2

添加文件到项目属性里面的Linker/input里面

三、在golang里面使用动态dll,也有3种方法

注意的是golang由于数据类型和c++的不一致,在需要传参的时候需要把所有的参数都转换成uintptr指针类型,而且转换的过程需要借助unsafe.Pointer指针
package mainimport ("fmt""syscall""unsafe"
)func IntPtr(n int) uintptr {return uintptr(n)
}func StrPtr(s string) uintptr {return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}
func Lib_add(a, b int) {lib := syscall.NewLazyDLL("lib.dll")fmt.Println("dll:", lib.Name)add := lib.NewProc("add")fmt.Println("+++++++NewProc:", add, "+++++++")ret, _, err := add.Call(IntPtr(a), IntPtr(b))if err != nil {fmt.Println("lib.dll运算结果为:", ret)}}func DllTestDef_add(a, b int) {DllTestDef, _ := syscall.LoadLibrary("DllTestDef.dll")fmt.Println("+++++++syscall.LoadLibrary:", DllTestDef, "+++++++")defer syscall.FreeLibrary(DllTestDef)add, err := syscall.GetProcAddress(DllTestDef, "add")fmt.Println("GetProcAddress", add)ret, _, err := syscall.Syscall(add,2,IntPtr(a),IntPtr(b),0)if err != nil {fmt.Println("DllTestDef.dll运算结果为:", ret)}}func DllTestDef_add2(a, b int) {DllTestDef := syscall.MustLoadDLL("DllTestDef.dll")add := DllTestDef.MustFindProc("add")fmt.Println("+++++++MustFindProc:", add, "+++++++")ret, _, err := add.Call(IntPtr(a), IntPtr(b))if err != nil {fmt.Println("DllTestDef的运算结果为:", ret)}
}func main() {Lib_add(4, 5)DllTestDef_add(4, 5)DllTestDef_add2(4, 5)
}

所有源码下载

转载于:https://www.cnblogs.com/lxsky/p/5203940.html

golang调用c++的dll库文件相关推荐

  1. LabVIEW与MATLAB联合编程之使用dll库文件连接

    LabVIEW与MATLAB联合编程之使用dll库文件连接 最近做东西的时候用到了在LabVIEW里面调用MATLAB的分类模型,辗转多篇文章终于搞定,特此记录,以供参考. 编程环境:Windows1 ...

  2. labview如何加载库_【LabVIEW教程】在LabVIEW中导入DLL库文件

    在LabVIEW中调用C++编写的库文件 0 前言 本来今天不打算更新了,恰好今天有客户有需求需要更新板卡的库文件. 这里就顺着这次工作,更新一节使用LabVIEW调用C++写的库文件. 有人就想到了 ...

  3. CDR插件开发之Addon插件005 - Corel.Interop.VGCore.dll库文件简介

    本文讲解了 Corel.Interop.VGCore.dll 库文件的基本概念,演示了如何在CDR软件的安装目录中查找到VGCore库文件所在的位置,最后演示了如何在C#项目中,添加 Corel.In ...

  4. php 调用vs2013 dll文件,VScode能编辑DLL库文件么

    我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦的是没有源代码可以进行修改,只能针对这个DLL的文件进行修改才能得到我们想要的结果. 本文将通过一个实例来演示:如何完成一个简单的修改. ...

  5. VS2013建立C++ dll库文件

    DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件.动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数.函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或 ...

  6. .net core 调用c dll_C++ 调用C封装DLL库的两种方式

    编写DLL代码 新建工程 新建空项目工程 点击确定.然后右键项目选择新建项. 出现下图,选择头文件. 再次选择新建项,选中C++文件,将其改为MySocketClient.c,然后选择添加. 到这里, ...

  7. QT开发调用FDTI ftd2xx.dll库

    最近使用FDTI的FT232HL开发产品,通过FT232HL将USB转为FIFO,完成PC端和FPGA硬件的通讯,官方给出的速度能到40MByte/S,原本抱着拿来主义的想法想在网上找些现成的代码,最 ...

  8. C#与VC相互调用之VC调用C#的DLL库

    介绍 在之前的博文 C#与VC相互调用之C#调用VC的DLL https://blog.csdn.net/xinxin_2011/article/details/86704660 里面讲了C#程序如何 ...

  9. 无法找到指定DLL库文件“v8.dIl“中的输出命令“Initializev8”

    目录 1.错误分析 2.资源下载 1.错误分析 今天下载了一款软件,软件名称是:鬼鬼JS调试工具7.5,运行的时候报以下错误信息. 很明显,这个报错信息是说软件需要一个dll库支持才能够正常运行.但是 ...

  10. Java调用C++的dll库

    项目中要实现java调用C++的dll,先实现个简单的加法.减法的案例.本案例为个人记录,为大家提供一些参考. 总体思路:先在Java中建立一个类--------通过javac命令生成.class-- ...

最新文章

  1. CSipSimple 工程分析 1
  2. python的优缺点有哪些-那么多人选择Python,它的优缺点有哪些?
  3. ubuntu 安装 Sublime Text 2
  4. Delphi中DLL封装业务逻辑的实现
  5. 如何写圆角矩形用html,圆角矩形的html+css实现
  6. 一个美国老工程师的心理话: 给年轻工程师的十大忠告
  7. iqn怎么查 linux_程序员必备:46个Linux面试常见问题!收藏!
  8. windows7黑屏修复_如何在Windows 10更新后修复黑屏
  9. Linux查找大文件 (find的用法)
  10. 深入分析FreeDos -- 前言
  11. Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view
  12. 整合TextBox与Label 创建新控件--EFLabelText
  13. sphinx下的max_matches取值对SetLimits的影响
  14. JDK8的新特性——Lambda表达式
  15. local class incompatible: stream classdesc serialVersionUID = -6513709415809811854, local class seri
  16. PHP工程师的最佳学习路线
  17. seaborn的多样化图表及图表样式设置
  18. 第三集 怪物学院 第十七章
  19. Can I debug relocated code at source-level with DS-5 Debugger?
  20. 网站出现DNS域名解析错误怎么办?

热门文章

  1. 持续输出|我的 2019 年
  2. dubbox 2.8.4的配置和使用
  3. JAVA 泛型 入门
  4. apache php 关闭版本号显示,不显示版本号
  5. Maven pom.xml 文件格式详解一
  6. 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_17、SpringBootTest单元测试实战...
  7. 阶段3 3.SpringMVC·_07.SSM整合案例_09.ssm整合之Spring整合MyBatis框架配置事务
  8. Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框(转载)
  9. 洛谷 P2879 [USACO07JAN]区间统计Tallest Cow
  10. 在webconfig中写好连接后,在程序中如何调用?