栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python | 使用ctypes访问dll

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python | 使用ctypes访问dll

nss3.dll链接到以下DLL,它们都位于Firefox目录中:nssutil3.dll,plc4.dll,plds4.dll,nspr4.dll和mozcrt19.dll。系统库加载程序在进程的DLL搜索路径中查找这些文件,这些路径包括应用程序目录,系统目录,当前目录以及

PATH
环境变量中列出的每个目录。

最简单的解决方案是将当前目录更改为DLL
Firefox目录。但是,这不是线程安全的,因此我一般不会依赖它。另一个选择是将Firefox目录附加到

PATH
环境变量,这是我在该答案的原始版本中建议的内容。但是,这并不比修改当前目录好多少。

(与更新KB2533623 NT
6.0或更高版本)较新版本的Windows让DLL搜索路径在一个线程安全的方式通过更新

SetDefaultDllDirectories
AddDllDirectory
RemoveDllDirectory
。但是这种方法将是最重要的。

在这种情况下,为了简化和与Windows的较旧版本兼容,只需

LoadLibraryEx
用flag调用就足够了
LOAD_WITH_ALTERED_SEARCH_PATH
。您需要使用绝对路径加载DLL,否则行为是不确定的。为了方便起见,我们可以继承
ctypes.CDLL
ctypes.WinDLL
调用
LoadLibraryEx
而不是
LoadLibrary

import osimport ctypesif os.name == 'nt':    from ctypes import wintypes    kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)    def check_bool(result, func, args):        if not result: raise ctypes.WinError(ctypes.get_last_error())        return args    kernel32.LoadLibraryExW.errcheck = check_bool    kernel32.LoadLibraryExW.restype = wintypes.HMODULE    kernel32.LoadLibraryExW.argtypes = (wintypes.LPCWSTR,       wintypes.HANDLE,       wintypes.DWORD)class CDLLEx(ctypes.CDLL):    def __init__(self, name, mode=0, handle=None,       use_errno=True, use_last_error=False):        if os.name == 'nt' and handle is None: handle = kernel32.LoadLibraryExW(name, None, mode)        super(CDLLEx, self).__init__(name, mode, handle,    use_errno, use_last_error)class WinDLLEx(ctypes.WinDLL):    def __init__(self, name, mode=0, handle=None,       use_errno=False, use_last_error=True):        if os.name == 'nt' and handle is None: handle = kernel32.LoadLibraryExW(name, None, mode)        super(WinDLLEx, self).__init__(name, mode, handle,      use_errno, use_last_error)

这是所有可用的

LoadLibraryEx
标志:

DONT_RESOLVE_DLL_REFERENCES         = 0x00000001LOAD_LIBRARY_AS_DATAFILE = 0x00000002LOAD_WITH_ALTERED_SEARCH_PATH       = 0x00000008LOAD_IGNORE_CODE_AUTHZ_LEVEL        = 0x00000010  # NT 6.1LOAD_LIBRARY_AS_IMAGE_RESOURCE      = 0x00000020  # NT 6.0LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE  = 0x00000040  # NT 6.0# These cannot be combined with LOAD_WITH_ALTERED_SEARCH_PATH.# Install update KB2533623 for NT 6.0 & 6.1.LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR    = 0x00000100LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200LOAD_LIBRARY_SEARCH_USER_DIRS       = 0x00000400LOAD_LIBRARY_SEARCH_SYSTEM32        = 0x00000800LOAD_LIBRARY_SEARCH_DEFAULT_DIRS    = 0x00001000

例如:

firefox_path = r'F:SoftwaresMozilla Firefox'nss3 = CDLLEx(os.path.join(firefox_path, 'nss3.dll'),    LOAD_WITH_ALTERED_SEARCH_PATH)nss3.NSS_GetVersion.restype = c_char_p>>> nss3.NSS_GetVersion()      '3.13.5.0 Basic ECC'


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号