首页 > 编程语言 >python调用c语言API

python调用c语言API

时间:2024-03-16 13:22:05浏览次数:23  
标签:调用 handle python cffi kernel32 API read ffi DWORD

python调用C语言API, 一般使用内置的ctypes库. 但是这个库用起来不那么方便, 主要是需要进行函数和数据结构的包装. 如下所示:

# 结构定义
class COORD(Structure):
    """ COORD structure """
    _fields_ = [("X", SHORT),
                ("Y", SHORT)]
# 函数定义
UpdateProcThreadAttribute = windll.kernel32.UpdateProcThreadAttribute
UpdateProcThreadAttribute.argtype = [
    POINTER(PVOID),
    DWORD,
    POINTER(DWORD),
    PVOID,
    SIZE_T,
    PVOID,
    POINTER(SIZE_T)
]
UpdateProcThreadAttribute.restype = BOOL
UpdateProcThreadAttribute.errcheck = _errcheck_bool

这是一个比较大的工作量, 也很不方便.

有一个cffi库, 可以简化这个过程. 使用示例如下:

from cffi import FFI

ffi = FFI()

# 定义需要使用的Windows API函数和结构
ffi.cdef("""
    BOOL CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe,
                    LPVOID lpPipeAttributes, DWORD nSize);
    BOOL WriteFile(HANDLE hFile, const void *lpBuffer, DWORD nNumberOfBytesToWrite,
                   LPDWORD lpNumberOfBytesWritten, LPVOID lpOverlapped);
    BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
                  LPDWORD lpNumberOfBytesRead, LPVOID lpOverlapped);
    BOOL CloseHandle(HANDLE hObject);
""")

# 加载kernel32.dll
kernel32 = ffi.dlopen("kernel32.dll")

# 创建管道的句柄
read_handle = ffi.new("PHANDLE")
write_handle = ffi.new("PHANDLE")

# 创建管道
if not kernel32.CreatePipe(read_handle, write_handle, ffi.NULL, 0):
    raise OSError("Failed to create pipe")

# 写入管道
message = b"Hello, pipe!"
bytes_written = ffi.new("LPDWORD")
if not kernel32.WriteFile(write_handle[0], message, len(message), bytes_written, ffi.NULL):
    raise OSError("Failed to write to pipe")

# 从管道读取
buffer = ffi.new("char[1024]")
bytes_read = ffi.new("DWORD[1]")
if not kernel32.ReadFile(read_handle[0], buffer, len(buffer), bytes_read, ffi.NULL):
    raise OSError("Failed to read from pipe")

# 输出读取到的数据
print(ffi.string(buffer, bytes_read[0]).decode())

# 关闭句柄
kernel32.CloseHandle(read_handle[0])
kernel32.CloseHandle(write_handle[0])

补充说明:

  • ffi.cdef函数声明C函数原型, windows的常见类型, 比如HANDLE,LPVOID,DWORD等已经事先定义好了, 对于额外的数据结构需要额外定义.
  • 函数原型可以直接查看<windows.h>相关文件定义, 拷贝过来即可.

CFFI库相关参考
网址: https://github.com/python-cffi/cffi
相关文档: https://cffi.readthedocs.io/en/stable/using.html

标签:调用,handle,python,cffi,kernel32,API,read,ffi,DWORD
From: https://www.cnblogs.com/huzhongqiang/p/18076934

相关文章

  • ssm/php/node/python高铁售票系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着科技的不断发展和进步,高铁已经成为了人们出行的主要交通方式之一。高铁的快速、便捷、舒适等特点使得越来越多的人选择乘坐高铁出行。为了满足人们......
  • ssm/php/node/python幸福小筑流浪猫救助网站
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速,流浪猫问题日益凸显,这些无家可归的小生命在城市的夹缝中艰难生存。幸福小筑流浪猫救助网站应运而生,旨在为这些流浪猫提供一个救援......
  • ssm/php/node/python高校实习实训管理系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着教育模式的不断创新与发展,高校教育已经不仅仅局限于传统的课堂理论教学。实践能力的培养被越来越多的高等教育机构所重视,实习实训成为了......
  • ssm/php/node/python学籍管理系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义标题:探索学籍管理系统2mc5o的应用与价值在信息技术高速发展的今天,教育管理的现代化已经成为提升教学质量和效率的关键。学籍管理系统2mc5o作为一款创新的管理工......
  • ssm/php/node/python学籍管理系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,教育行业也在逐渐实现数字化转型。学籍管理作为学校管理工作中的一个重要环节,其效率和准确性直接影响到学校的教学质量及管理水......
  • ssm/php/node/python学生出国境学习交流管理
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着全球化的不断深入,学生出国境学习交流已成为教育国际化的一个重要组成部分。管理87153课程针对的是那些计划或正在参与跨国学术活动的学生,其核心目的......
  • ssm/php/node/python学生党员学习系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今时代,随着信息技术的迅猛发展,网络平台已成为知识传播和学习交流的重要场所。特别是对于学生党员而言,他们作为党和国家未来的栋梁之才,不仅需要系统......
  • 基本技术指标 Python 实现
    布林带SharpCharts计算*MiddleBand=20-daysimplemovingaverage(SMA)*UpperBand=20-daySMA+(20-daystandarddeviationofpricex2)*LowerBand=20-daySMA-(20-daystandarddeviationofpricex2)点击这里下载此电子表格示例。")布林......
  • springboot/java/php/node/python农产品销售系统小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的迅猛发展,传统农产品销售模式正逐步向线上转移。小程序作为移动互联网的一种轻量级应用,因其开发成本低、传播快、使用方便等特点,成为连接......
  • python知识点(1)
    python知识点基础数据类型整形int浮点型float布尔型bool字符型string整形int:int是一种提示没有任何作用是编辑器提供的和解释器无关type()查看变量的数据类型age:float=18print(age,type(age))#输出结果18<class'int'>进制转换37->转换二......