高级语言调用C接口(二)回调函数(4)Python

前面2篇分别说了java和c#调用C接口,参数为回调函数,回调函数中参数是结构体指针。

接下来说下python的调用方法。

from ctypes import *
import sysclass stPayResult(Structure):_pack_ = 4  # 根据实际C结构体的对齐方式设置(常见值为1,4,8)_fields_ = [("place", enPlace),("errCode", c_char_p),("errInfo", c_char_p),("seqId", c_char_p),("merOrderId", c_char_p),("srcReserve", c_char_p),("attachedData", c_char_p),("totalAmount", c_char_p),("couponAmount", c_char_p),("payAmount", c_char_p),("payTime", c_char_p),("orderCreateTime", c_char_p),("status", c_char_p)]# 定义回调类型(严格匹配C函数调用约定)
OnPayResult = CFUNCTYPE(None, POINTER(stPayResult))# 加载C库(示例使用Windows DLL)
try:sdk = CDLL("./xxx.dll")  # 替换为实际库路径
except Exception as e:print(f"加载动态库失败: {str(e)}")sys.exit(1)# 严格设置函数原型
sdk.Init.argtypes = [c_char_p, c_ushort, OnPayResult]
sdk.Init.restype = c_size_t# 保持回调函数引用防止GC
_callback_ref = Nonedef init_sdk():global _callback_ref# 包装回调函数def py_pay_result(p_result):if not p_result:print("收到空指针!")returntry:# 安全访问结构体内容result = p_result.contents# 处理可能为NULL的字符串err_code = result.errCode.decode() if result.errCode else ""err_info = result.errInfo.decode() if result.errInfo else ""print(f"错误码: {err_code}, 错误信息: {err_info}")except Exception as e:print(f"处理回调时发生异常: {str(e)}")# 转换为C回调并保持引用_callback_ref = OnPayResult(py_pay_result)# 调用初始化ip = b"127.0.0.1"port = 443return sdk.Init(ip, port, _callback_ref)if __name__ == "__main__":init_sdk()print("SDK初始化完成,等待回调...")# 保持程序运行(根据实际需求调整)while True:pass

这里重要的点是回调函数中,结构体指针是C代码分配的内存,与python有区别,C的结构体中的字段并没有各种方法和属性,需要注意转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot启动动态定时任务

1.自定义定时任务线程池 package com.x.devicetcpserver.global.tcp.tcpscheduler;import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…

pytorch框架认识--手写数字识别

手写数字是机器学习中非常经典的案例,本文将通过pytorch框架,利用神经网络来实现手写数字识别 pytorch中提供了手写数字的数据集,我们可以直接从pytorch中下载 MNIST中包含70000张手写数字图像:60000张用于训练,10000…

WPF 使用依赖注入后关闭窗口程序不结束

原因是在ViewModel中在构造函数中注入了Window 对象,即使没有使用,主窗口关闭程序不会退出,即使 ViewModel 是 AddTransient 注入的。 解决方法:不使用构造函数注入Window,通过GetService获取Window 通过注入对象调用…

用户管理(添加和删除,查询信息,切换用户,查看登录用户,用户组,配置文件)

目录 添加和删除用户 查询用户信息 切换用户 查看当前的操作用户是谁 查看首次登录的用户是谁 用户组(对属于同个角色的用户统一管理) 新增组 删除组 添加用户的同时,指定组 修改用户的组 组的配置文件(/etc/group&…

PyTorch学习-小土堆教程

网络搭建torch.nn.Module 卷积操作 torch.nn.functional.conv2d(input, weight, biasNone, stride1, padding0, dilation1, groups1) 神经网络-卷积层

MVCC详细介绍及面试题

目录 1.什么是mvcc? 2.问题引入 3. MVCC实现原理? 3.1 隐藏字段 3.2 undo log 日志 3.2.1 undo log版本链 3.3 readview 3.3.1 当前读 ​编辑 3.3.2 快照读 3.3.3 ReadView中4个核心字段 3.3.4 版本数据链访问的规则(了解&#x…

企业级Active Directory架构设计与运维管理白皮书

企业级Active Directory架构设计与运维管理白皮书 第一章 多域架构设计与信任管理 1.1 企业域架构拓扑设计 1.1.1 林架构设计规范 林根域规划原则: 采用三段式域名结构(如corp.enterprise.com),避免使用不相关的顶级域名架构主…

android11 DevicePolicyManager浅析

目录 📘 简单定义 📘应用启用设备管理者 📂 文件位置 🧠 DevicePolicyManager 功能分类举例 🛡️ 1. 安全策略控制 📷 2. 控制硬件功能 🧰 3. 应用管理 🔒 4. 用户管理 &am…

Java学习手册:Java线程安全与同步机制

在Java并发编程中,线程安全和同步机制是确保程序正确性和数据一致性的关键。当多个线程同时访问共享资源时,如果不加以控制,可能会导致数据不一致、竞态条件等问题。本文将深入探讨Java中的线程安全问题以及解决这些问题的同步机制。 线程安…

PyTorch核心函数详解:gather与where的实战指南

PyTorch中的torch.gather和torch.where是处理张量数据的关键工具,前者实现基于索引的灵活数据提取,后者完成条件筛选与动态生成。本文通过典型应用场景和代码演示,深入解析两者的工作原理及使用技巧,帮助开发者提升数据处理的灵活…

声学测温度原理解释

已知声速,就可以得到温度。 不同温度下的胜诉不同。 25度的声速大约346m/s 绝对温度-273度 不同温度下的声速。 FPGA 通过测距雷达测温度,固定测量距离,或者可以测出当前距离。已知距离,然后雷达发出声波到接收到回波的时间&a…

【网络篇】UDP协议的封装分用全过程

大家好呀 我是浪前 今天讲解的是网络篇的第二章:UDP协议的封装分用 我们的协议最开始是OSI七层网络协议 这个OSI 七层网络协议 是计算机的大佬写的,但是这个协议一共有七层,太多了太麻烦了,于是我们就把这个七层网络协议就简化为…

spring-ai-alibaba使用Agent实现智能机票助手

示例目标是使用 Spring AI Alibaba 框架开发一个智能机票助手,它可以帮助消费者完成机票预定、问题解答、机票改签、取消等动作,具体要求为: 基于 AI 大模型与用户对话,理解用户自然语言表达的需求支持多轮连续对话,能…

嵌入式C语言高级编程:OOP封装、TDD测试与防御性编程实践

一、面向对象编程(OOP) 尽管 C 语言并非面向对象编程语言,但借助一些编程技巧,也能实现面向对象编程(OOP)的核心特性,如封装、继承和多态。 1.1 封装 封装是把数据和操作数据的函数捆绑在一起,对外部隐藏…

蓝桥杯 web 常考到的一些知识点

filter:filter方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。这个 方法不会改变原数组,而是返回一个新的数组。 map:map方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的 返回…

音视频小白系统入门笔记-0

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败&#xff1f; 默认…

mysql按条件三表并联查询

下面为你呈现一个 MySQL 按条件三表并联查询的示例。假定有三个表&#xff1a;students、courses 和 enrollments&#xff0c;它们的结构和关联如下&#xff1a; students 表&#xff1a;包含学生的基本信息&#xff0c;有 student_id 和 student_name 等字段。courses 表&…

UML之序列图的消息

序列图表现各参与者之间为完成某个行为而发生的交互及其时间顺序&#xff0c;序列图中的交互通过消息实现。消息是从一条生命线到另一条生命线的通信&#xff0c;它们通常是水平或倾斜向下的箭头&#xff0c;从发送方生命线离开&#xff0c;到达接收方生命线。如果需要&#xf…

UniAD:自动驾驶的统一架构 - 创新与挑战并存

引言 自动驾驶技术正经历一场架构革命。传统上&#xff0c;自动驾驶系统采用模块化设计&#xff0c;将感知、预测和规划分离为独立组件。而上海人工智能实验室的OpenDriveLab团队提出的UniAD&#xff08;Unified Autonomous Driving&#xff09;则尝试将这些任务整合到一个统一…

如何写好合同管理系统需求分析

引言 在当今企业数字化转型的浪潮中&#xff0c;合同管理系统作为企业法律合规和商业运营的重要支撑工具&#xff0c;其需求分析的准确性和完整性直接关系到系统建设的成败。本文基于Volere需求过程方法论&#xff0c;结合江铃汽车集团合同管理系统需求规格说明书实践案例&…