函数名称
在这个样例的Python源代码里,把从动态连接库获取到的函数地址赋值给变量MessageBox,然后通过MessageBox就能够调用动态连接库里的函数了。
windll.user32是实现了载入动态连接库user32.dll,而windll.user32.MessageBoxW是实现了从动态连接库user32.dll获取到函数MessageBoxW的地址。假设获取一个在动态连接库里不存在的函数时,ctypes会输出例如以下异常:
Traceback (most recent call last):
File "E:\my\git\pywingui\python_win32\pytest_3.py", line 7, in <module>
MessageBox = windll.user32.MessageBox
File "E:\Milang\python\lib\ctypes\__init__.py", line 364, in __getattr__
func = self.__getitem__(name)
File "E:\Milang\python\lib\ctypes\__init__.py", line 369, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'MessageBox' not found
因此,要想使用哪一个API函数,要先从Windows的SDK文档里查看是否存在这个函数。以及这个函数的正确导出名称。
可是总是有例外的。比方在msvcrt.dll里,有一些名称并非符合Python里命名规范的。而採用一些不能出现的字符,如“?
?
3@YAXPAX@Z”这种名称。那么採用上面点号运算来获取函数的地址,就不可行了。须要使用另外的方式才干够,而是使用getattr函数。例如以下形式:
from ctypes import *
import win32con
print(getattr(cdll.msvcrt, "??3@YAXPAX@Z"))
在这里。getattr是ctypes库的方法。cdll.msvcrt是windows操作系统的C++执行库,"?
?
3@YAXPAX@Z"是函数的名称。这行代码意思就是把"?
?
3@YAXPAX@Z"函数的地址打印出来。
另一种更加特殊的情况,比方微软根本就不公开它的名称,但你又想使用它,那怎么办呢?当你遇到这种事情时。可能会想到向微软求助,但人家不公开可能有种种原因,比方说商业上打压竞争对象,又或者会影响系统的安全。
无论何种原因,在Python的ctypes库里也提供了一种更强劲的支持。就是支持按函数的索引號去调用。例如以下样例所看到的:
print(cdll.msvcrt[1])
在这里。cdll.msvcrt是载入动态连接库msvcrt.dll,cdll.msvcrt[1]是表示获取动态连接里排在第一个位置的函数地址。当然获取到函数地址,也并不能马上调用这些不公开的函数,还须要了解这些函数的调用方式。比方參数个数、參数类型以及返回值,这部分内容大家仅仅能去反汇编了,通过反汇编查看函数相关内容,就能够使用不公开的函数的功能。
相关文章
- Mathf数学函数总结
- python实现求和,求平均值——函数
- 视图函数
- MATLABfill函数_matlab中C的模块名称是什么
- Delphi中谨慎使用QuotedStr、QuotedString、DequotedString相关的函数
- 【Android Gradle 插件】settings.gradle 配置文件 ( 配置基本作用 | include 函数用法 | 目录层级配置 | 修改 Module 模块构建脚本名称 )
- 【Unity3D】Unity 脚本 ③ ( C# 脚本的执行入口函数 | 获取当前游戏物体及物体名称 | 获取游戏物体的 Transform 组件数据 | UnityEngine 命名空间简介 )
- 【错误记录】在 Android Studio 的 Terminal 终端执行 gradlew 报错 ( 无法将“gradlew”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称 )
- 函数认识Linux中atoi函数(linuxatoi)
- Python中int()函数的用法
- Oracle内部函数挖掘机遇之旅(oracle内部函数调用)
- Oracle数据库如何修改函数名称(oracle修改函数名称)
- Oracle Q函数快速定位自定义可查询性(oracle q 函数)
- 函数名称函数功能
- jquery下组织javascript代码(js函数化)
- jqueryisEmptyObject判断是否为空对象的函数
- php中判断文件空目录是否有读写权限的函数代码
- Jquery中"$(document).ready(function(){})"函数的使用详解
- php函数与传递参数实例分析
- Javascript学习笔记之函数篇(二):this的工作机制
- WinForm自定义函数FindControl实现按名称查找控件