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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
教你学会使用Python正则表达式
Sep 07 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
Python面向对象程序设计示例小结
Jan 30 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
Python logging设置和logger解析
Aug 28 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
python初步实现word2vec操作
Jun 09 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
python调用百度API实现人脸识别
Nov 17 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
Python实现单例模式的5种方法
Jun 15 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
咖啡与水的关系
2021/03/03 冲泡冲煮
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
寻找网站后台地址的python脚本
2014/09/01 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
详解Python的三种可变参数
2019/05/08 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
工作决心书范文
2014/03/11 职场文书
感谢信范文大全
2015/01/23 职场文书
自主招生专家推荐信
2015/03/26 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书