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中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
Django objects的查询结果转化为json的三种方式的方法
Nov 07 Python
详解django2中关于时间处理策略
Mar 06 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
解决python3输入的坑——input()
Dec 05 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
python异常和文件处理机制详解
2016/07/19 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Django自定义认证方式用法示例
2017/06/23 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
幼儿园保育员辞职信
2014/01/12 职场文书
企业内控岗位的职责
2014/02/07 职场文书
工程专业应届生求职信
2014/02/19 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
用python批量解压带密码的压缩包
2021/05/31 Python