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使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
Python创建字典的八种方式
Feb 27 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
python变量的存储原理详解
Jul 10 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
用python3读取python2的pickle数据方式
Dec 25 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 13 Python
如何用Python提取10000份log中的产品信息
Jan 14 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
用JavaScript显示随机图像或引用
2009/04/21 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
Python3 处理JSON的实例详解
2017/10/29 Python
Python实现两款计算器功能示例
2017/12/19 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
活动志愿者自荐信
2014/01/27 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
浪费资源的建议书
2014/03/12 职场文书
出生公证书样本
2014/04/04 职场文书
融资租赁计划书
2014/04/29 职场文书
植树节活动总结
2014/04/30 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
辞职信格式模板
2015/02/27 职场文书
新员工试用期自我评价
2015/03/10 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python