Golang 编写动态链接库

107 阅读1分钟
package main

import "C"

//export Sum
func Sum(a int, b int) int {
    return a + b;
}

func main() {}

编译

go build -buildmode=c-shared -o exportgo.dll 1.go

调用

C++

#include <iostream>
#include <Windows.h>
int main()
{
	HMODULE h = NULL;//创建一个句柄h
	h = LoadLibrary("exportgo.dll");
	if (h == NULL)//检测是否加载dll成功
	{
		printf("nul\n");
		return -1;
	}


	typedef int(*AddFunc)(int, int); // 定义函数指针类型
	AddFunc Sum;
	// 导出函数地址
	Sum = (AddFunc)GetProcAddress(h, "Sum");


	int sum = Sum(100, 200);
	printf("jieguo: %d\n", sum);

	return 0;
}

Node.js

var ffi = require('ffi-napi')
var path = require('path')

var dllPath = path.resolve("./exportgo.dll");
var dllfuns = ffi.Library(dllPath, {
    'Sum': [ 'int', [ 'int', 'int' ] ],
});

var s = dllfuns.Sum(1,2);

console.log(s)

Python

from ctypes import cdll, c_int

# 加载动态链接库
lib = cdll.LoadLibrary('./exportgo.dll')

# 配置输出参数变量类型
lib.Sum.restype = c_int

# 调用方法
rest = lib.Sum(1,2)

print(rest)