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 Django批量导入不重复数据
Mar 25 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Python3 log10()函数简单用法
Feb 19 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
Python 串口读写的实现方法
Jun 12 Python
实例详解Python模块decimal
Jun 26 Python
python getpass模块用法及实例详解
Oct 07 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
详解如何使用Pytest进行自动化测试
Jan 14 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
深入掌握include_once与require_once的区别
2013/06/17 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
js replace 与replaceall实例用法详解
2013/08/03 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
JsChart组件使用详解
2018/03/04 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
总结Python编程中三条常用的技巧
2015/05/11 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
十佳教师事迹材料
2014/01/11 职场文书
数学教学随笔感言
2014/02/17 职场文书
护理专业自荐书
2014/06/04 职场文书
学校社会实践活动总结
2014/07/03 职场文书
合同纠纷调解书
2015/05/20 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers