当前位置: 首页 > news >正文

python如何调用dll文件中的函数

C或C++编写的程序效率非常高,有些复杂的计算python不如C或C++程序,所以有时使用python调用C或C++编写编译为 DLL 的文件来处理问题,那 python 如何调用dll文件中的函数呢?

一,生成 DLL 文件,

假设C或C++编写文件名为userDevDll01.cpp的内容如下,文件编译输出dll文件的userDevDll01.dll的内容

// 文件编译输出dll文件的userDevDll01.dll的内容,可定义更多复杂业务逻辑 #include <stdio.h> __declspec(dllexport) int fun01(int a, int b) { return a * b; }

编译生成的DLL 文件存放:F:\userDllFiles\userDevDll01.dll

二,在 python 中调用 DLL 文件

1,使用 python 的 ctypes 模块操作DLL

2,加载 DLL 文件,

3,定义 DLL 的入参的数据类型和返回值的数据类型,

4,python 调用的 DLL 中的方法

参考如下例子:

# -*- coding: UTF-8 -*- # ======================================== # @ProjectName: pythonws001 # @Filename: call_dll.py # @Copyright www.637hulian.com # @Author: shenzhennba(Administrator) # @Version 1.0 # @Since 2025/12/13 15:52 # ======================================== # python调用dll文件 # ======================================== # 1.导入ctypes模块 import ctypes import logging import os import com.pro001.log.pro_log_config as pro_log_config # 调用配置函数,通常在模块加载时调用 pro_log_config.setup_logging() # 获取日志对象和是指各种输出处理器, # 每个模块将有自己的日志记录器,并且可以通过模块名来区分日志消息的来源。 logger = logging.getLogger(__name__) def call_dll_fun01(dll_full_path): """ 调用指定路径的dll中的函数 """ if not os.path.exists(dll_full_path): logging.info(f'dll文件不存在: {dll_full_path}') return None try: # 2.加载dll文件 lib01 = ctypes.WinDLL(dll_full_path) #lib01 = ctypes.cdll.LoadLibrary(dll_full_path) # 3,指定dll中的函数fun01返回值类型和参数类型 lib01.fun01.restype = ctypes.c_int lib01.fun01.argtypes = [ctypes.c_int, ctypes.c_int] # 4.调用dll中的函数 ret = lib01.fun01(10, 20) logging.info(f'调用dll函数fun01返回值:{ret}') return ret except Exception as e: logging.error(f'调用dll函数fun01异常:info:\n{e}') return None def main(): """ 主函数 """ # 假设C或C++编写的dll文件位于如下路径 dll_full_path = r'F:\userDllFiles\userDevDll01.dll' v = call_dll_fun01(dll_full_path) print(f'call dll fun01: {v}') if __name__ == '__main__': main()
http://www.cnnetsun.cn/news/40803.html

相关文章:

  • 随机图床 _
  • PETools 逆向工程工具完整使用指南
  • 改善深层神经网络 第一周:深度学习的实践(四)其他缓解过拟合的方法
  • 品牌营销 深度心智方法论
  • STM32之使用DWT外设编写延时函数
  • 选择中国优化路线的美国独立服务器的8大好处
  • Abaqus三维纤维复合材料Vumat子程序:弹性层压板+Hashin损伤(纤维)+Puck损...
  • 移动应用无障碍测试完全指南:如何用Maestro实现WCAG标准自动化验证
  • Effective C++ 中文版第3版:C++进阶编程的终极指南
  • Slang光线追踪加速结构深度解析:从理论到性能优化实践
  • DeepSeek-R1-Distill-Qwen-7B集群部署终极指南:轻松搞定AI推理服务
  • 风储调频在Matlab/Simulink中的探索:基于四机两区系统的实践
  • 基于Java Swing的猜数字小游戏(2)
  • 提升 Web 端 JavaScript 的可信度:WAICT 体系详解
  • Solon (可替换 SpringBoot)集成 Docker 实战:30分钟搞定轻量级应用容器化部署
  • 一次 React 项目 lock 文件冲突修复:从 Hook 报错到 Vite 配置优化
  • 记录一次USB虚拟网络问题排查
  • 学Simulink——基于高比例可再生能源渗透的复杂电网建模场景实例:大规模光伏并网对区域电网频率稳定影响研究
  • CANN Samples(十九):特色场景:机器人 AI 绘画 手写识别等
  • 毕设开源 深度学习YOLO交通路面缺陷检测系统(源码+论文)
  • 【URP】Unity[后处理]色彩调整ColorAdjustments
  • Flutter混合开发与WebView集成实战
  • 压缩空气储能和释能阶段模型,附相关文档文献。 建立了压缩空气储能系统中的压缩机、换热器、储气罐...
  • Profinet转Modbus TCP工业数据采集网关:实现1200PLC 与打标卡数据实时传输
  • Flutter 2025 国际化与本地化实战:从多语言支持到文化适配,打造真正全球化的用户体验
  • P1178 到天宫做客 题解
  • 2025年GEO优化机会与争议以及规范发展的必要性
  • 2026老年春晚怀化区域节目征集启动仪式在怀化学院举行
  • 【笔记篇】【硬件基础篇】电力电子元器件应用手册 阅读笔记(1)电阻器及其应用
  • 柠檬 软件测试之python全栈自动化测试工程师第25期