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

如何在Python中从SXS加载C DLL?

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

如何在Python中从SXS加载C DLL?

这是一个从WinSxS目录加载CRT的示例。

actctx.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">    <dependency>        <dependentAssembly> <assemblyIdentity     type="win32"     name="Microsoft.VC90.CRT"     version="9.0.21022.8"     processorArchitecture="amd64"     publicKeyToken="1fc8b3b9a1e18e3b"> </assemblyIdentity>        </dependentAssembly>    </dependency></assembly>

actctx.py:

from ctypes import *from ctypes.wintypes import *kernel32 = WinDLL("kernel32", use_last_error=True)ACTCTX_FLAG_PROCESSOR_ARCHITECTURE_VALID = 0x001ACTCTX_FLAG_LANGID_VALID = 0x002ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID = 0x004ACTCTX_FLAG_RESOURCE_NAME_VALID = 0x008ACTCTX_FLAG_SET_PROCESS_DEFAULT = 0x010ACTCTX_FLAG_APPLICATION_NAME_VALID = 0x020ACTCTX_FLAG_HMODULE_VALID = 0x080DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION = 1INVALID_HANDLE_VALUE = HANDLE(-1).valueULONG_PTR = WPARAM  # pointer-sized unsigned integerclass ACTCTX(Structure):    _fields_ = (("cbSize", ULONG),     ("dwFlags", DWORD),     ("lpSource", LPCWSTR),     ("wProcessorArchitecture", USHORT),     ("wLangId", LANGID),     ("lpAssemblyDirectory", LPCWSTR),     ("lpResourceName", LPCWSTR),     ("lpApplicationName", LPCWSTR),     ("hModule", HMODULE))    def __init__(self, *args, **kwds):        super(ACTCTX, self).__init__(sizeof(self), *args, **kwds)CreateActCtxW = kernel32.CreateActCtxWCreateActCtxW.restype = HANDLECreateActCtxW.argtypes = (POINTER(ACTCTX),)ReleaseActCtx = kernel32.ReleaseActCtxReleaseActCtx.restype = NoneReleaseActCtx.argtypes = (HANDLE,)ActivateActCtx = kernel32.ActivateActCtxActivateActCtx.argtypes = (HANDLE, POINTER(ULONG_PTR))DeactivateActCtx = kernel32.DeactivateActCtxDeactivateActCtx.argtypes = (DWORD, ULONG_PTR)if __name__ == "__main__":    manifest_path = "actctx.manifest" # keep ref    ctx = ACTCTX(lpSource=manifest_path)    hActCtx = CreateActCtxW(byref(ctx))    if hActCtx == INVALID_HANDLE_VALUE:        raise WinError(get_last_error())    cookie = ULONG_PTR()    if not ActivateActCtx(hActCtx, byref(cookie)):        raise WinError()    msvcr90 = CDLL("msvcr90")    if not DeactivateActCtx(0, cookie):        raise WinError(get_last_error())    ReleaseActCtx(hActCtx)    # show DLL path    hModule = HANDLE(msvcr90._handle)    path = (c_wchar * 260)()        kernel32.GetModuleFileNameW(hModule, path, len(path))    print(path.value)

输出:

C:WindowsWinSxSamd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_08e61857a83bc251msvcr90.DLL

这已在VS 2010内置的Python
3.4.2下进行了测试,而该链接与msvcr100.dll链接。因此,至少在这种情况下,确实需要设置激活上下文,否则加载msvcr90.dll将失败

ERROR_MOD_NOT_FOUND



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

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

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