Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python高阶教程-调用win c/c++ dll文件

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

作者头像
羽翰尘
修改于 2019-11-26 09:00:58
修改于 2019-11-26 09:00:58
3.5K0
举报
文章被收录于专栏:技术向技术向

本文由腾讯云+社区自动同步,原文地址 https://cloud.tencent.com/developer/article/1540893

本篇内容来自原创小册子《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.

代码语言:txt
AI代码解释
复制
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文件

代码语言:txt
AI代码解释
复制
#ifdef __cplusplus
extern "C"{
#endif
int __stdcall __declspec(dllexport) MyAdd(int nA, int nB);
 
#ifdef __cplusplus
}
#endif

2.TestDll.cpp文件

代码语言:txt
AI代码解释
复制
#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编译脚本

代码语言:txt
AI代码解释
复制
gcc TestDll.cpp -shared -o TestDll.dll

4.TestDll.py调用

代码语言:txt
AI代码解释
复制
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. 指针作为参数
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[C-C++]DLL之旅2 : 调用DLL(静态&动态加载)
原文链接:http://blog.csdn.net/humanking7/article/details/78586478
祥知道
2020/03/10
3.2K0
Python使用Ctypes与C/C++
项目中可能会经常用到第三方库,主要是出于程序效率考虑和节约开发时间避免重复造轮子。无论第三方库开源与否,编程语言是否与当前项目一致,我们最终的目的是在当前编程环境中调用库中的方法并得到结果或者借助库中的模块实现某种功能。这个过程会牵涉到很多东西,本篇文章将简要的介绍一下该过程的一些问题。
py3study
2020/01/20
2.7K0
Python调用DLL
C语言中的函数默认是__cdecl调用,C++中可用__stdcall来显示声明调用,但也可以用extern “C”
py3study
2020/01/08
2.9K0
python 调用dll
首先用visual studio写个dll。 // TestDll.cpp : Defines the entry point for the DLL application. //
全栈程序员站长
2021/08/13
2.8K0
Dll 导出函数那些破事
经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。
战神伽罗
2019/07/24
2.3K0
Dll 导出函数那些破事
python调用dll文件接口
在Python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平台为例子),当然我假设你们已经对windows下怎么写一个DLL是没有问题的。 引入ctypes库 
py3study
2020/01/10
5.9K0
白加黑免杀制作(详细)
最近被微步的一篇文章吸引了,里面讲到银狐通过自解压白 exe + 黑 dll 执行截取主线程添加自启动,发现 dll 与普通的免杀有很大的不同,决定自己尝试一下,虽然我之前没有做过白加黑免杀,感觉应该不会太难,但是当我真正尝试的时候才发现很多问题,如:
Creaper
2023/11/20
9.6K2
白加黑免杀制作(详细)
python调用dll动态库
python调用动态库有两种类型,主要看dll的导出函数的调用约定:__stdll和__cdecl
py3study
2020/01/08
2.7K0
c++DLL编程详解
DLL(Dynamic Link Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库
拾点阳光
2018/05/10
2.5K0
Qt中纯C++项目发布为dll的方法(超详细步骤)
目录 一般创建方法 导出普通函数的方法&调用方法 导出类及其成员函数的方法&调用方法 众所周知,我们可以将C++项目中的类以及函数导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使
用户1198337
2018/01/19
2.1K0
Qt中纯C++项目发布为dll的方法(超详细步骤)
dll生成和使用
dll文件的编译生成 创建项目Win32控制台应用程序 创建项目1.png 创建项目2.png 配置属性 项目/属性 配置属性.png
用户2929716
2018/08/23
1.3K0
dll生成和使用
Win32编程之静态库编写与使用.动态链接库的编写与使用
  静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在不行了.一个项目往往要很多人一起去编写.而其中用到的技术就类似于静态库.
IBinary
2022/05/10
9000
Win32编程之静态库编写与使用.动态链接库的编写与使用
一分钟详解VS中快速生成dll和lib方法
问题:如果我们在Visual Studio工程中,想要快速学习如何生成dll和lib,有什么小技巧呢?
3D视觉工坊
2020/12/11
2.9K0
一分钟详解VS中快速生成dll和lib方法
ndk C++ 编译器的函数名修饰规则
最近ndk debug好痛苦,堆栈里都是C++修饰过的名字,每次转化成实际的类和方法都要脑子里转一下,虽说c++filt可以转换,但是转换后可能更蒙蔽。。。这里贴出两篇文章供参考。
望天
2019/08/29
2.2K0
12、动态链接库,dll
动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。
全栈程序员站长
2022/07/05
1.1K0
12、动态链接库,dll
VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)
使用VS2017项目模板创建C++动态库生成工程,生成动态库。然后再创建一个C++工程调用动态库完成测试。
DS小龙哥
2022/01/17
1.4K0
VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)
VS下dll的生成和使用
我在去年其实写过一篇关于dll的博客,但当时只是简单记录了过程,今年在给新员工出dll题目时,发现很多人对dll不太熟悉,所以想再写一篇博客,详细讲讲。
无敌清风蓝
2024/06/04
4580
[C-C++]DLL之旅1 : 将程序打包成DLL
原文链接:http://blog.csdn.net/humanking7/article/details/78585004
祥知道
2020/03/10
2.4K0
C++ 动态链接库 DLL 的一些笔记
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
饶文津
2020/06/02
1.1K0
【专业技术第五讲】动态链接库及其用法
存在的疑惑: 动态链接库到底如何来使用?特别是windows上面 解决方案: 本篇我们讲Windows上的动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),它是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。 动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个
程序员互动联盟
2018/03/15
1.1K0
【专业技术第五讲】动态链接库及其用法
相关推荐
[C-C++]DLL之旅2 : 调用DLL(静态&动态加载)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档