前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python高阶教程-调用win c/c++ dll文件

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

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

本文由腾讯云+社区自动同步,原文地址 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python调用dll文件接口
在Python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平台为例子),当然我假设你们已经对windows下怎么写一个DLL是没有问题的。 引入ctypes库 
py3study
2020/01/10
5.6K0
[C-C++]DLL之旅2 : 调用DLL(静态&动态加载)
原文链接:http://blog.csdn.net/humanking7/article/details/78586478
祥知道
2020/03/10
2.8K0
Python使用Ctypes与C/C++
项目中可能会经常用到第三方库,主要是出于程序效率考虑和节约开发时间避免重复造轮子。无论第三方库开源与否,编程语言是否与当前项目一致,我们最终的目的是在当前编程环境中调用库中的方法并得到结果或者借助库中的模块实现某种功能。这个过程会牵涉到很多东西,本篇文章将简要的介绍一下该过程的一些问题。
py3study
2020/01/20
2.5K0
Python调用DLL
C语言中的函数默认是__cdecl调用,C++中可用__stdcall来显示声明调用,但也可以用extern “C”
py3study
2020/01/08
2.7K0
python调用dll动态库
python调用动态库有两种类型,主要看dll的导出函数的调用约定:__stdll和__cdecl
py3study
2020/01/08
2.4K0
python 调用dll
首先用visual studio写个dll。 // TestDll.cpp : Defines the entry point for the DLL application. //
全栈程序员站长
2021/08/13
2.6K0
Dll 导出函数那些破事
经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。
战神伽罗
2019/07/24
2.2K0
Dll 导出函数那些破事
exe调用DLL的方式
编写dll时,有个重要的问题需要解决,那就是函数重命名——Name-Mangling。解决方式有两种,一种是直接在代码里解决采用extent”c”、_declspec(dllexport)、#pragma comment(linker, "/export:[Exports Name]=[Mangling Name]"),另一种是采用def文件。
CN_Simo
2020/08/20
2.7K0
Win32编程之静态库编写与使用.动态链接库的编写与使用
  静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在不行了.一个项目往往要很多人一起去编写.而其中用到的技术就类似于静态库.
IBinary
2022/05/10
7650
Win32编程之静态库编写与使用.动态链接库的编写与使用
C++ 编写DLL文件给易语言调用
弗兰克的猫
2018/01/09
3.7K0
12、动态链接库,dll
动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。
全栈程序员站长
2022/07/05
8600
12、动态链接库,dll
ndk C++ 编译器的函数名修饰规则
最近ndk debug好痛苦,堆栈里都是C++修饰过的名字,每次转化成实际的类和方法都要脑子里转一下,虽说c++filt可以转换,但是转换后可能更蒙蔽。。。这里贴出两篇文章供参考。
望天
2019/08/29
2.1K0
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
Building shared lib... g++ -c -fPIC Quote.cpp -o Quote.o g++ -c -fPIC QuoteExport.cpp -o QuoteExport.o g++ -c -fPIC Start.cpp -o Start.o Generating shared lib... g++ -shared -fPIC -o libQuoteLib.so ./Quote.o ./QuoteExport.o ./Start.o cp libQuoteLib.so ../ OK!
杨永贞
2020/08/04
6K0
VS2017生成DLL(C语言)文件并在C#中使用
下面我们将在VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件)
zls365
2021/01/28
2.4K0
【操作系统】动态链接库
DLL就是整个windows操作系统的基础。动态链接库不能直接运行,也不能接收消息。他们就是一些独立的文件。
半生瓜的blog
2023/05/13
8260
【操作系统】动态链接库
Qt中纯C++项目发布为dll的方法(超详细步骤)
目录 一般创建方法 导出普通函数的方法&调用方法 导出类及其成员函数的方法&调用方法 众所周知,我们可以将C++项目中的类以及函数导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使
用户1198337
2018/01/19
1.8K0
Qt中纯C++项目发布为dll的方法(超详细步骤)
VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)
使用VS2017项目模板创建C++动态库生成工程,生成动态库。然后再创建一个C++工程调用动态库完成测试。
DS小龙哥
2022/01/17
1.2K0
VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)
[C-C++]DLL之旅1 : 将程序打包成DLL
原文链接:http://blog.csdn.net/humanking7/article/details/78585004
祥知道
2020/03/10
2.2K0
c#开发的客户端,如何调用c++开发的sdk dll库
c#客户端不能直接调用c++ dll,需要做2个黏合层把它们连接起来,这里以trtc sdk的dll为例
Tomas7571
2021/05/14
5.5K0
c#开发的客户端,如何调用c++开发的sdk dll库
白加黑免杀制作(详细)
最近被微步的一篇文章吸引了,里面讲到银狐通过自解压白 exe + 黑 dll 执行截取主线程添加自启动,发现 dll 与普通的免杀有很大的不同,决定自己尝试一下,虽然我之前没有做过白加黑免杀,感觉应该不会太难,但是当我真正尝试的时候才发现很多问题,如:
Creaper
2023/11/20
7.8K2
白加黑免杀制作(详细)
相关推荐
python调用dll文件接口
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文