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

如何在Python中从SXS加载C DLL?,第1张

如何在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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5645586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存