这是一个从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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)