zoukankan      html  css  js  c++  java
  • 功能名称

    在此示例Python源代码。从一个动态链接库获取到的功能分配给该变量的地址MessageBox,然后通过MessageBox就能够调用动态连接库里的函数了。windll.user32是实现了载入动态连接库user32.dll,而windll.user32.MessageBoxW是实现了从动态连接库user32.dll获取到函数MessageBoxW的地址。

    假设获取一个在动态连接库里不存在的函数时,ctypes会输出例如以下异常:

    Traceback (most recent call last):

      File "E:mygitpywinguipython_win32pytest_3.py", line 7, in <module>

        MessageBox = windll.user32.MessageBox

      File "E:Milangpythonlibctypes\__init__.py", line 364, in __getattr__

        func = self.__getitem__(name)

      File "E:Milangpythonlibctypes\__init__.py", line 369, in __getitem__

        func = self._FuncPtr((name_or_ordinal, self))

    AttributeError: function 'MessageBox' not found

    因此,要想使用哪一个API函数,要先从WindowsSDK文档里查看是否存在这个函数。以及这个函数的正确导出名称。

    可是总是有例外的,比方在msvcrt.dll里,有一些名称并非符合Python里命名规范的,而採用一些不能出现的字符,如“?

    ?3@YAXPAX@Z”这种名称。那么採用上面点号运算来获取函数的地址,就不可行了,须要使用另外的方式才干够,而是使用getattr函数,例如以下形式:

    from ctypes import *

    import win32con

    print(getattr(cdll.msvcrt, "?

    ?3@YAXPAX@Z"))

    在这里,getattrctypes库的方法,cdll.msvcrtwindows操作系统的C++执行库,"?

    ?

    3@YAXPAX@Z"是函数的名称。

    这行代码意思就是把"?

    ?3@YAXPAX@Z"函数的地址打印出来。

    另一种更加特殊的情况。比方微软根本就不公开它的名称,但你又想使用它。那怎么办呢?当你遇到这种事情时。可能会想到向微软求助。但人家不公开可能有种种原因,比方说商业上打压竞争对象,又或者会影响系统的安全。无论何种原因,在Pythonctypes库里也提供了一种更强劲的支持。就是支持按函数的索引號去调用,例如以下样例所看到的:

    print(cdll.msvcrt[1])

    在这里,cdll.msvcrt是载入动态连接库msvcrt.dllcdll.msvcrt[1]是表示获取动态连接里排在第一个位置的函数地址。

    当然获取到函数地址。也并不能马上调用这些不公开的函数。还须要了解这些函数的调用方式,比方參数个数、參数类型以及返回值。这部分内容大家仅仅能去反汇编了,通过反汇编视图功能相关内容,也可以使用该函数不会打开。

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    自由职业一时爽,一直自由一直爽
    N+6 裁员裁出幸福感的背后
    你真的了解 Cookie 和 Session 吗?
    百亿级企业级 RPC 框架开源了!
    做一个有脑子的程序员
    Java 生态核心知识点整理
    关于第三方支付,看这篇文章就够了!
    程序员该不该主动提加薪?
    我是为何下定决心入行程序员的
    老程序员被新程序员拍在沙滩上?
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4624893.html
Copyright © 2011-2022 走看看