函数名称
来源:互联网 发布:知乎开放注册时间 编辑:程序博客网 时间:2024/04/28 17:11
在这个例子的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]是表示获取动态连接里排在第一个位置的函数地址。当然获取到函数地址,也并不能立即调用这些不公开的函数,还需要了解这些函数的调用方式,比如参数个数、参数类型以及返回值,这部分内容大家只能去反汇编了,通过反汇编查看函数相关内容,就可以使用不公开的函数的功能。
- 函数名称
- 函数名称与变量名称
- 设置线程名称函数
- java 打印函数名称
- 查看函数名称修饰
- 汇编-获取函数名称
- python生成函数名称
- JS函数名称
- 【python】取得函数名称,类名称
- 由函数名称调用函数
- 由函数名称调用函数
- 函数简介 函数名称: strrchr
- 根据函数名称导出函数
- 自定义函数名称不能与系统函数名称重复
- 函数名称: fopen、fread、fwrite
- 函数调用与名称修饰
- 获取计算机名称的函数
- 函数调用与名称空间
- 设计模式——组合设计模式
- js捕获回车事件
- 【2014】最新处理硬盘物理坏道方法教程
- B. Little Pony and Sort by Shift
- Unity3D NGUI按钮背景转换
- 函数名称
- A3的Android 2.1的多点触摸电容屏3G智能手机凭借双核和Appleui
- 黑马程序员-交通灯
- MFC程序中添加ICONTEXTMENU菜单 VS2005编译错误
- 类的构造函数、析构函数与赋值函数(二)构造函数的初始化表
- 关于gemotion的各种报错
- hdu-oj 1431 素数回文
- java批量创建文件
- Sprague-Grundy函数