调用GetStatusDownloadFile遇类型错误:需LP_c_short而非结构体,如何处理?
解决ctypes调用GetStatusDownloadFile时的LP_c_short类型错误
你犯了一个关键错误:把C语言的枚举类型错误定义成了结构体。C里的枚举本质是单个整数类型(这里是c_short),而函数GetStatusDownloadFile的第二个参数pState需要的是LP_c_short——也就是指向c_short的指针,用来接收当前的下载状态值。
第一步:正确定义枚举常量
不需要结构体,直接用ctypes.c_short定义枚举值即可,或者用更规范的Enum类(Python 3.4+支持):
方式1:直接定义常量
import ctypes # 对应C端的枚举定义 Error = ctypes.c_short(-1) Inactive = ctypes.c_short(0) Config = ctypes.c_short(1) ListenBootMode = ctypes.c_short(2) ClearPattern = ctypes.c_short(3) SetBank = ctypes.c_short(4) ListenBank = ctypes.c_short(5) EraseFlash = ctypes.c_short(6) ListenErased = ctypes.c_short(7) Load = ctypes.c_short(8) Loading = ctypes.c_short(9) Terminate = ctypes.c_short(10) Successful = ctypes.c_short(11)
方式2:用Enum类封装
import ctypes from enum import Enum class DownloadState(Enum): Error = ctypes.c_short(-1) Inactive = ctypes.c_short(0) Config = ctypes.c_short(1) ListenBootMode = ctypes.c_short(2) ClearPattern = ctypes.c_short(3) SetBank = ctypes.c_short(4) ListenBank = ctypes.c_short(5) EraseFlash = ctypes.c_short(6) ListenErased = ctypes.c_short(7) Load = ctypes.c_short(8) Loading = ctypes.c_short(9) Terminate = ctypes.c_short(10) Successful = ctypes.c_short(11)
第二步:传递符合要求的LP_c_short参数
函数需要的是一个指向c_short的指针,用来接收状态值。你需要先创建一个c_short实例,然后通过ctypes.byref()或ctypes.pointer()传递它的指针:
# 初始化一个c_short变量,用于接收当前状态 current_state = ctypes.c_short() # 调用函数,传入current_state的指针 Result = GetStatusDownloadFile(self.server, ctypes.byref(current_state), progress) # 获取返回的状态值 print(f"当前下载状态:{current_state.value}") # 可以和枚举常量对比判断状态 if current_state.value == DownloadState.Successful.value: print("下载完成") elif current_state.value == DownloadState.Loading.value: print("正在下载中")
为什么之前的结构体不行?
C语言的枚举不是结构体,它是一组命名的整数常量,底层只占用单个short的内存空间。你定义的结构体包含多个short字段,和函数期望的“单个short的指针”类型完全不匹配,因此触发了ctypes.ArgumentError。
内容的提问来源于stack exchange,提问作者martinmistere
相关产品推荐
相关产品推荐

