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文件及目录操作实例详解
Jun 04 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
python 上下文管理器使用方法小结
Oct 10 Python
python中的字典操作及字典函数
Jan 03 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
如何通过python实现全排列
Feb 11 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
python多进程使用函数封装实例
May 02 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
使用npy转image图像并保存的实例
Jul 01 Python
Python 如何展开嵌套的序列
Aug 01 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
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
了解VUE的render函数的使用
2017/06/08 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
python实现自动化上线脚本的示例
2019/07/01 Python
python实时监控logstash日志代码
2020/04/27 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
2014学雷锋活动总结
2014/03/09 职场文书
监督检查工作方案
2014/05/28 职场文书
2015年元旦标语大全
2014/12/09 职场文书
中班下学期个人总结
2015/02/12 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
公路施工安全责任书
2015/05/08 职场文书
体育教师研修感悟
2015/11/18 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
Vue h函数的使用详解
2022/02/18 Vue.js
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android