首页 > 编程语言 >简化python ctypes库调用API的封装

简化python ctypes库调用API的封装

时间:2024-03-19 10:55:24浏览次数:34  
标签:CreatePipe lpPipeAttributes 封装 python API ctypes PHANDLE DWORD BOOL

使用ctypes库调用C的函数, 需要进行封装. 如下所示:

# 对结构的封装
class STARTUPINFOEX(Structure):
    """ STARTUPINFOEX structure """
    _fields_ = [("StartupInfo", STARTUPINFO),
                ("lpAttributeList", POINTER(PVOID))]
# 对函数的封装
UpdateProcThreadAttribute = windll.kernel32.UpdateProcThreadAttribute
UpdateProcThreadAttribute.argtype = [
    POINTER(PVOID),
    DWORD,
    POINTER(DWORD),
    PVOID,
    SIZE_T,
    PVOID,
    POINTER(SIZE_T)
]
UpdateProcThreadAttribute.restype = BOOL

这个过程比较繁琐. 我做了一下优化, 简化使用场景如下:

CreatePipe = my_api.cdef('''
WINBASEAPI
BOOL
WINAPI
CreatePipe(
    _Out_ PHANDLE hReadPipe,
    _Out_ PHANDLE hWritePipe,
    _In_opt_ LPVOID lpPipeAttributes,
    _In_ DWORD nSize
    );
''')

用户只需要把C语言定义的函数描述拷贝下来, 剩下的封装工作就自动完成了.
结构也是同样的道理:

COORD,PCOORD = my_api.cdef('''
typedef struct _COORD {
    SHORT X;
    SHORT Y;
} COORD, *PCOORD;
''')

不仅如此, 通过访问函数或者结构的typing_notion属性, 可以自动生成类型注解相关的代码, 如下所示:

def CreatePipe(hReadPipe:PHANDLE,hWritePipe:PHANDLE,lpPipeAttributes:LPVOID,nSize:DWORD)->BOOL:pass
CreatePipe = my_api.cdef('''
WINBASEAPI
BOOL
WINAPI
CreatePipe(
    _Out_ PHANDLE hReadPipe,
    _Out_ PHANDLE hWritePipe,
    _In_opt_ LPVOID lpPipeAttributes,
    _In_ DWORD nSize
    );
''')

print(CreatePipe.typing_notion)
# 输出: def CreatePipe(hReadPipe:PHANDLE,hWritePipe:PHANDLE,lpPipeAttributes:LPVOID,nSize:DWORD)->BOOL:pass

这样就可以享受类型注解的好处了(比如代码自动补全), 同时也不影响函数的功能.

标签:CreatePipe,lpPipeAttributes,封装,python,API,ctypes,PHANDLE,DWORD,BOOL
From: https://www.cnblogs.com/huzhongqiang/p/18082217

相关文章

  • EBS调用API验证库存现用量和可用量
    inv_quantity_tree_pub.query_quantities(p_api_version_number=>1.0,x_return_status=>l_return_status,x_msg_count=>l_msg_count,......
  • Python轻松实现地图可视化(附详细源码) 转载
    大家好,我是J哥,专注原创,致力于用浅显易懂的语言分享爬虫、数据分析及可视化等干货,希望人人都能学到新知识。Python的地图可视化库很多,Matplotlib库虽然作图很强大,但只能做静态地图。而我今天要讲的是交互式地图库,分别为pyecharts、folium,掌握这两个库,基本可以解决你的地图可视化需......
  • 如何返回标准 API 的错误信息
    --lv_msg_count:为api返回参数,为消息的个数。--根据消息的具体情况,循环次数要做相应调整。加大次数,消息内容就多,反之则少.iflv_msg_count>0thenlv_mesg:=chr(10)||substr(fnd_msg_pub.get(fnd_msg_pub.g_first,fnd_api.g_false),......
  • 标准API展开BOM代码
    --BOM_EXPLOSION_temp是一个临时表,在展BOM的时候,是一个很有用的表,存放了组成料件层次。默认时是没有记录的,加入下列的语句:DECLAREl_group_idNUMBER;l_error_messageVARCHAR2(1000);l_error_codeNUMBER;BEGINSELECTbom.bom_explosion_temp_s.NE......
  • Python伪数据生成器Mimesis 使用
    一、**Mimesis的介绍**Mimesis是一个用于Python的high-performance伪数据生成器,它用各种语言为各种目的提供数据。这些假数据可以用来填充测试数据库,创建假API端点,创建任意结构的JSON和XML文件,匿名化从生产中获取的数据等等。二、**主要特点是:***性能:Python可用的最快的数......
  • 二维前缀和&二维差分(超详细,python版,其他语言也很轻松能看懂)
    上一篇文章讲解了一维前缀和&一维差分,本篇进阶为二维。二维前缀和:二维前缀和跟一维前缀和求法相同,这里直接上例子。数组a=[[1,2,2,1],[3,2,2,1],[1,1,1,1]]a数组如图:则数组a的前缀和为:数组b[[1,3,5,6],[4,8,12,14],[5,10,15,18]]b数组如图:前缀和递推公式为b[i][......
  • 【黑马程序员】Python高阶
    文章目录闭包定义nonlocal关键字作用优缺点优点缺点装饰器装饰器闭包写法设计模式单例模式工厂模式优点代码示例多线程基本概念threading模块网络编程服务端开发socketsocket服务端编程客户端开发正则表达式正则的三个基础方法matchsearchfindAll元字符匹配单字......
  • java常用应用程序编程接口(API)——Stream概述
    前言:stream是jdk8以后新增的API,熟练操作后会非常实用。打好基础,daydayup!!StreamStream也称为Stream流,用于操作集合或者数组的数据。Stream流大量的结合了Lambda的语法风格,使代码更简洁,可读性更好 Stream的使用Stream的使用有三个步骤:1,获取Stream流,与数据源建立连接......
  • python基础中的基础
    python基础学习Created:November28,20236:48PMTags:Beginning值得思考的一些事情......
  • 【20.7】Django表单API详解
    【一】引入声明:以下的Form、表单等术语都指的的广义的Django表单。Form要么是绑定了数据的,要么是未绑定数据的。如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单。如果未绑定,则无法进行验证(因为没有数据可以验证!),但它仍然可以以HTML形式呈现空白表单。若要......