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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
浅要分析Python程序与C程序的结合使用
Apr 07 Python
python如何查看系统网络流量的信息
Sep 12 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
Python之pymysql的使用小结
Jul 01 Python
python django model联合主键的例子
Aug 06 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
区分python中的进程与线程
Aug 13 Python
Python如何将模块打包并发布
Aug 30 Python
pandas取dataframe特定行列的实现方法
May 24 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程序
2006/10/09 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
Vue中props的使用详解
2018/06/15 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
node 版本切换的实现
2020/02/02 Javascript
python抓取网页内容示例分享
2014/02/24 Python
python字符串string的内置方法实例详解
2018/05/14 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
Java基础知识面试要点
2016/07/29 面试题
毕业自我评价范文
2013/11/17 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
同学聚会开幕词
2019/04/02 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Java死锁的排查
2022/05/11 Java/Android