python高阶教程-调用win c/c++ dll文件

本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/104/

本篇内容来自原创小册子《python高阶教程》

背景

某些情况下,我们需要python与其他编程语言,如c/c++联合运行,以获得额外的性能或者功能。比如,将

经常调用的业务逻辑用c重写一遍,提高效率;或者重复利用已经开发好的dll库,缩短开发周期。

两种调用c/c++库的方式

  1. __stdcall方式

在python中通过dll = ctypes.WinDLL("TestDll.dll")调用

  1. __cdecl方式

在python中通过dll = ctypes.cdll.LoadLibrary("TestDll.dll")调用

具体使用了哪种方式需要看源码,如果不知道源码,可以两种方式都试试,错误的调用方式会

出现以下ValueError.

ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong calling convention

查看dll中的函数名称

实际上,编译器会修改函数的名称。虽然可以通过.def文件来禁止编译器做修改,但是尚未发现在MinGW上如果操作。在本文中使用Dependency Walker(depends)软件读取dll中的函数列表,获取函数名称。

下载地址

简单Demo

1.TestDll.h文件

#ifdef __cplusplus
extern "C"{
#endif
int __stdcall __declspec(dllexport) MyAdd(int nA, int nB);
 
#ifdef __cplusplus
}
#endif

2.TestDll.cpp文件

#include "TestDll.h"
 
#ifdef __cplusplus
extern "C"{
#endif
int __stdcall __declspec(dllexport) MyAdd(int nA, int nB)
{
    return nA + nB;
}
#ifdef __cplusplus
}
#endif

3.TestDll.bat编译脚本

gcc TestDll.cpp -shared -o TestDll.dll

4.TestDll.py调用

import ctypes
 
# 导出函数是__stdcall声明的使用
dll = ctypes.WinDLL("TestDll.dll")
# 导出函数是__cdecl声明的使用
#dll = ctypes.cdll.LoadLibrary("TestDll.dll")

summmm = getattr(dll, 'MyAdd@8')
ret = summmm(2, 4)
print(ret)

运行后会看到python脚本输出了正确结果。

TODO

  1. ctypes中的c与python对象映射表
  2. 指针作为参数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏国产程序员

什么是Java中的魔法值?

魔法数值、魔法数字、魔法值,这是一个东西,不同的叫法。 所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义。

61300
来自专栏大话swift

SwiftUI值弹出菜单

}) {

6320
来自专栏Java开发者杂谈

一文理解java对象初始化顺序

​ 由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang....

9630
来自专栏eguid开源技术分享

javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

13420
来自专栏大学生计算机视觉学习DeepLearning

关于MFC与OpenGL结合绘图区域用鼠标来控制图形的移动总结

原文链接:https://www.cnblogs.com/DOMLX/p/11773171.html

10920
来自专栏数据分析1480

Pandas中文官档~基础用法2

Series 与 DataFrame 支持大量计算描述性统计的方法与操作。这些方法大部分都是 sum()、mean()、quantile() 等聚合函数,其输出...

8110
来自专栏Java开发者杂谈

图说jdk1.8新特性(4)--- stream

8520
来自专栏飞总聊IT

说说提高Python运行效率的技巧?

答:不喜欢Python的人经常会吐嘈Python运行太慢。今天具体来说一下提高python执行效率的方法,下面给大家介绍10种方法 。

12320
来自专栏互扯程序

Java finally 语句到底是在 return 之前还是之后执行?

今天跟大家分享下Java finally语句的知识。finally隐藏了这样的细节?

5110
来自专栏AI科技评论

学界 | NeurIPS 2018 中的贝叶斯研究

此次会议支持现场直播,所有讲座的视频内容均可以在 NeurIPS 的 Facebook 主页上找到,除此之外,NeurIPS 主页上还有一些非常有趣的主题演讲,...

8750

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励