python调用dll详解
参考链接https://www.cnblogs.com/TQCAI/p/8881530.html
https://www.jb51.net/article/52513.htm
https://www.cnblogs.com/pyse/p/8590829.html
windows安装MinGW-w64教程https://www.cnblogs.com/ggg-327931457/p/9694516.html
公司业务需要,让我用python调用领导写好的dll库,经过一段时间的研究,终于调用成功,特此来记录一下过程
开发环境win10+python3.6.8(64位)
1.安装MinGW-w64
安装这个的目的是生成dll文件用,参考地址在上面,讲一下注意的点。
- 安装的时候version选择最新的即可。
- 安装目录随便选,不是C盘也可以.
在这一步下载的时候,大概是20分钟左右,如果觉得慢的话,可以直接去下载源码然后解压即可,参考文章里的八、问题列表里有说明- 安装好记得在命令行里面验证一下是否正确安装
2.编写文件生成dll
#include <stdio.h>
extern "C" {
__declspec(dllexport) int Double(int x);
__declspec(dllexport) float floatAdd(float a,float b);
__declspec(dllexport) void HelloWorld(char * str);
__declspec(dllexport) void Ints(int * arr,int n);
}
int Double(int x){
return x*;
}
float floatAdd(float a,float b) {
return a+b;
}
void HelloWorld(char * str){
puts(str);
}
void Ints(int * arr,int n){
for(int i=;i<n;i++){
printf("%d ",arr[i]);
}
puts("");
}
生成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)
输出内容
<WinDLL 'E:\code\lx_code\dlltest.dll', handle 6c100000 at 0x27f2ab8bc88>
<class 'int'>
246
到这里,就算调用成功了。
4.可能会遇到的问题
ctypes库加载dll有好几种方式,你可以自己尝试一下用哪一种方式,参考网址https://www.cnblogs.com/baihuitestsoftware/articles/5345089.html
stdcall调用约定:两种加载方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl调用约定:也有两种加载方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
# 其实windll和cdll分别是WinDLL类和CDll类的对象。
python调用dll详解的更多相关文章
- 【VB技巧】VB静态调用与动态调用dll详解
本文“[VB技巧]VB静态调用与动态调用dll详解”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=489,转载请注明作者及出处! [[请注意]]:在以下 ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- Python模块调用方式详解
Python模块调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其 ...
- Python包模块化调用方式详解
Python包模块化调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一般来说,编程语言中,库.包.模块是同一种概念,是代码组织方式. Python中只有一种模块对象类型 ...
- python time模块详解
python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明 一.简介 ...
- Python中dict详解
from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...
- (转)python collections模块详解
python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...
- Python之print详解
Python之print详解 http://www.jb51.net/article/55768.htm print的一些基本用法,在前面的讲述中也涉及一些,本讲是在复习的基础上,尽量再多点内容. ...
- Python字符编码详解,str,bytes
什么是明文 “明文”是可以是文本,音乐,可以编码成mp3文件.明文可以是图像的,可以编码为gif.png或jpg文件.明文是电影的,可以编码成wmv文件.不一而足. 什么是编码?把明文变成计算机语言 ...
随机推荐
- linux内核驱动module_init解析(1)
本文转载自博客http://blog.csdn.net/richard_liujh/article/details/45669207 写过linux驱动的程序猿都知道module_init() 这个函 ...
- spring cloud eureka注册原理-注册失败填坑
写在前面 我们知道Eureka分为两部分,Eureka Server和Eureka Client.Eureka Server充当注册中心的角色,Eureka Client相对于Eureka Serve ...
- 会了docker你又多了一个谈资(下)
上篇文章介绍了docker 基本使用及安装([跳转☞会了docker你又多了一个谈资(上)],这篇重点说明下docker使用技巧. 问题1怎么用docker搭建多台服务器? 只需要 docker ru ...
- PAT Basic 1011 A+B 和 C (15 分)
给定区间 [−] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤),是测试用例的个数.随后给出 T 组测试用例,每组占一行,顺序给出 ...
- 面试复习题(二)JavaSE高级(未完成)
一.Java中的反射 3.说说你对Java中反射的理解 Java中的反射首先是能够获取到Java中要反射类的字节码,获取字节码有3种办法. class.forName(className) 类名.cl ...
- nginx 常用的命令和配置文件
常用的命令 进入 nginx 目录中 cd /usr/local/nginx/sbin 1.查看 nginx 版本号 ./nginx -v 2.启动 nginx ./nginx 3.停止 n ...
- java将一数组乱序排列
JAVA的Collections类中shuffle方法模拟了“洗牌”动作可以对list列表进行随机排序.如果一定要自己写,算法也很简单:假设数组array长度为n.用标准随机函数rand(n)生成[0 ...
- linux服务器上如何使用nginx访问本地静态资源
查看80端口是否被占用,一般80端口多被apache服务占用. netstat -anp|grep 80 2.修改apache服务的端口号 vim /etc/apache2/ports.conf 3. ...
- 过滤器、拦截器、AOP的区别
过滤器 过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletResponse response),并对请求响应做出响应的过滤操作,比如设置字符编码.鉴权操作 ...
- 搭建web服务器---Apache服务器
一.安装Apache 尽管xampp appserv等提供了方便的集成环境,但实际上部署环境还是下载单独安装的Apache,以避免那些安全问题 二.加载php解析模块,并指定模块处理文件的类型 编辑h ...