公司业务需要,让我用python调用领导写好的dll库,经过一段时间的研究,终于调用成功,特此来记录一下过程
开发环境win10+python3.6.8(64位)
1.安装MinGW-w64
安装这个的目的是生成dll文件用,参考地址在上面,讲一下注意的点。
安装的时候version选择最新的即可。
安装目录随便选,不是C盘也可以.
在这一步下载的时候,大概是20分钟左右,如果觉得慢的话,可以直接去下载源码然后解压即可,参考文章里的八、问题列表里有说明
安装好记得在命令行里面验证一下是否正确安装
2.编写文件生成dll
#include
extern "C"{
__declspec(dllexport)int Double(intx);
__declspec(dllexport)float floatAdd(float a,floatb);
__declspec(dllexport)void HelloWorld(char *str);
__declspec(dllexport)void Ints(int * arr,intn);
}int Double(intx){return x*2;
}float floatAdd(float a,floatb) {return a+b;
}void HelloWorld(char *str){
puts(str);
}void Ints(int * arr,intn){for(int i=0;i
printf("%d",arr[i]);
}
puts("");
}
View Code
生成dll
g++ dlltest.cpp -shared -o dlltest.dll
3.python调用dll
from ctypes import *dll= windll.LoadLibrary('E:\code\lx_code\dlltest.dll')print(dll)
a=dll.Double(123)print(type(a))print(a)
输出内容
246
到这里,就算调用成功了。
4.可能会遇到的问题
stdcall调用约定:两种加载方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll= ctypes.WinDLL("dllpath")
cdecl调用约定:也有两种加载方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll= ctypes.CDLL("dllpath")#其实windll和cdll分别是WinDLL类和CDll类的对象。