Python 调用 Windows API COM 新法


Posted in Python onAugust 22, 2019

Python中调用Win32API 通常都是使用 PyWin32或者ctypes。但要么依赖文件较多,要么用法繁琐。

这里介绍在Python中调用Win32 API 或者COM组件的另一个更好的,功能也更强大的解决方案。

首先需要确保安装的是 32位的Python(2.x 或者 3.x 均可)。

下载通用库:win32exts for Python:

             https://github.com/tankaishuai/win32exts_for_Python

将win32exts.pyd 放入 Python/DLLs 目录下即可。发布时 仅有此一个文件而已。

import win32exts

win32exts调用的基本用法如下:

(1)常规具名函数(以MessageBoxA/W为例)调用:

首先需要导入模块符号。第一个参数为待加载的模块名,可以带路径,传入"*"表示当前进程的所有模块;

第二个参数表示函数符号名称,传入"*"表示该模块的所有符号。

win32exts.load_sym("*", "*")
或 win32exts.load_sym("C:\\windows\\system32\\user32.dll", "MessageBoxW")
或 win32exts.load_sym("user32", "MessageBoxA")
或 win32exts.load_sym("user32", "*")

然后:

win32exts.MessageBoxA(0, "call MessageBoxA", "", 1)

宽字符需要用 win32exts.L() 包装,与C/C++雷同。

win32exts.MessageBoxW(0, win32exts.L("call MessageBoxW"), None, 1)

(2)带回调的函数(以EnumWindows为例)调用:

先分配一块内存后面用:

g_buf = win32exts.malloc(2*260)

定义一个回调函数:

def EnumWndProc(args): 
  #【args为参数包,以下取参数】
  hWnd = win32exts.arg(args, 1)
  lParam = win32exts.arg(args, 2)
  win32exts.GetWindowTextW(hWnd, g_buf, 260)
  #【读取内存中的宽字符串】
  #【read_***系列接口读内存,write_***系列接口写内存】
  strText = win32exts.read_wstring(g_buf, 0, -1)
  win32exts.MessageBoxW(0, win32exts.L(strText), g_buf, 1)
  strRetVal = "1, 8"
  g_index = g_index + 1
  if g_index > 3: #【假设只弹框三次】
   strRetVal = "0, 8"
  #【返回值是形如这样的字符串: "回调返回值, 参数字节数",
  # 对于 cdecl 调用约定,参数字节数总是取 0 】
  return strRetVal

然后调用:

win32exts.EnumWindows(win32exts.callback("EnumWndProc"), 0)
win32exts.callback()用于包装一个Python回调函数。

(3)匿名(非具名)函数调用:

假设通过某个接口获取了某函数的地址 lFuncAddr,然后可以类似下述方式调用:

win32exts.push_value(arg1) 【参数是整数】
win32exts.push_wstring("arg2") 【参数是宽字符串】
win32exts.push_astring(arg3) 【参数是多字节字符串】
win32exts.push_double(arg4) 【参数是双精度浮点数】
win32exts.push_float(arg5) 【参数是单精度浮点数】
win32exts.push_function("FunctionName") 【参数是回调函数】

iRetVal = win32exts.call( lFuncAddr )

当然具名函数也可以类似调用,例如:

win32exts.push_value(0)
win32exts.push_astring("Py_MessageBoxA_V1")
win32exts.push_value(0)
win32exts.push_value(0)
iRetVal = win32exts.sym_call("MessageBoxA") #【或用 func_call】

(4)调用COM组件:

import win32exts
#
# 测试 COM 组件, 打开计算器
#
wsh = win32exts.co_create_ ("W .Shell")
win32exts.co_push_start()
win32exts.push_bstr("calc")
win32exts.co_invoke(wsh, "Run")
win32exts.co_release(wsh)

知识点扩展:

python调用windows api

import ctypes
# 方式一
ctypes.windll.user32.MessageBoxA(None, 'message', 'title', 0)
# 方式二
ctypes.WinDLL('user32.dll').MessageBoxA(None, 'message', 'title', 0)

总结

以上所述是小编给大家介绍的Python 调用 Windows API COM 新法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python Django批量导入数据
Mar 25 Python
详解python 发送邮件实例代码
Dec 22 Python
Python正则表达式知识汇总
Sep 22 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
python 图片去噪的方法示例
Jul 09 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
Python3中FuzzyWuzzy库实例用法
Nov 18 Python
详解Python文件修改的两种方式
Aug 22 #Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 #Python
python支付宝支付示例详解
Aug 22 #Python
关于python3中setup.py小概念解析
Aug 22 #Python
python3 requests库文件上传与下载实现详解
Aug 22 #Python
python3使用print打印带颜色的字符串代码实例
Aug 22 #Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 #Python
You might like
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
js 通过cookie实现刷新不变化树形菜单
2014/10/30 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
python爬虫 正则表达式解析
2019/09/28 Python
python实时监控logstash日志代码
2020/04/27 Python
Python实现自动整理文件的脚本
2020/12/17 Python
python urllib和urllib3知识点总结
2021/02/08 Python
Myholidays美国:在线旅游网站
2019/08/16 全球购物
政府绩效管理实施方案
2014/05/04 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
教师业务学习材料
2014/12/16 职场文书
项目经理岗位职责
2015/01/31 职场文书
银行求职信模板
2015/03/20 职场文书
单位同意报考证明
2015/06/17 职场文书
新学期开学标语2015
2015/07/16 职场文书
《小小的船》教学反思
2016/02/18 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang