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 07 Python
Python中多线程及程序锁浅析
Jan 21 Python
Cpy和Python的效率对比
Mar 20 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
Python读写文件方法总结
Jun 09 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 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
微信支付开发订单查询实例
2016/07/12 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
javascript实现window.print()去除页眉页脚
2014/12/30 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
python操作列表的函数使用代码详解
2017/12/28 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Python 字符串与数字输出方法
2018/07/16 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
金智子午JAVA面试题
2015/09/04 面试题
《巨人的花园》教学反思
2014/02/12 职场文书
酒店仓管员岗位职责
2014/04/28 职场文书
中学教师师德承诺书
2014/05/23 职场文书
毕业生实习证明
2014/09/19 职场文书
教师节联欢会主持词
2015/07/04 职场文书
安全伴我行主题班会
2015/08/13 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
Redis三种集群模式详解
2021/10/05 Redis
详解Python内置模块Collections
2022/03/22 Python