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实现无证书加密解密实例
Oct 27 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
Python 控制终端输出文字的实例
Jul 12 Python
Python如何使用字符打印照片
Jan 03 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
Django中F函数的使用示例代码详解
Jul 06 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
PyCharm最新激活码(2020/10/27全网最新)
Oct 27 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仿discuz分页效果代码
2008/10/02 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
python 正则式使用心得
2009/05/07 Python
利用python获得时间的实例说明
2013/03/25 Python
python中readline判断文件读取结束的方法
2014/11/08 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
Python实现二叉堆
2016/02/03 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
Python读写文件基础知识点
2019/06/10 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
python 写一个文件分发小程序
2020/12/05 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
基层党员对照检查材料
2014/09/24 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书