通常,通过在与可执行文件一起存在的清单文件中指定DLL依赖关系来完成此操作。但是,我不知道如何在Python中完成此操作。加载DLL并不是问题,但是要在SXS中找到合适的DLL来加载才是问题。
是否有用于指定在哪里找到DLL的标准过程?对于此示例,我们假设它位于此处:
c:\windows\winsxs\amd64_my_handy_lib_<public_key_token>_1.0.0.0_none_<some_ID>
我是否真的需要手动搜索c:\windows\winsxs
目录以按名称查找我的DLL,然后检查父目录以查看其是否包含正确的版本?
我只是没有做足够的Python项目来知道什么合适的方法来完成此任务。
这是一个从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 = 0x001
ACTCTX_FLAG_LANGID_VALID = 0x002
ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID = 0x004
ACTCTX_FLAG_RESOURCE_NAME_VALID = 0x008
ACTCTX_FLAG_SET_PROCESS_DEFAULT = 0x010
ACTCTX_FLAG_APPLICATION_NAME_VALID = 0x020
ACTCTX_FLAG_HMODULE_VALID = 0x080
DEACTIVATE_ACTCTX_FLAG_FORCE_EARLY_DEACTIVATION = 1
INVALID_HANDLE_VALUE = HANDLE(-1).value
ULONG_PTR = WPARAM # pointer-sized unsigned integer
class 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.CreateActCtxW
CreateActCtxW.restype = HANDLE
CreateActCtxW.argtypes = (POINTER(ACTCTX),)
ReleaseActCtx = kernel32.ReleaseActCtx
ReleaseActCtx.restype = None
ReleaseActCtx.argtypes = (HANDLE,)
ActivateActCtx = kernel32.ActivateActCtx
ActivateActCtx.argtypes = (HANDLE, POINTER(ULONG_PTR))
DeactivateActCtx = kernel32.DeactivateActCtx
DeactivateActCtx.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:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_08e61857a83bc251\msvcr90.DLL
这已在VS 2010内置的Python
3.4.2下进行了测试,而该链接与msvcr100.dll链接。因此,至少在这种情况下,确实需要设置激活上下文,否则加载msvcr90.dll将失败ERROR_MOD_NOT_FOUND
。
问题内容: 如果我导入的模块定义了属于同一个包的同名类,则由于父包的__init__.py,它将作为类而不是模块导入。有关详细信息,请在不同目录中查看不同的导入结果。在Python Shell或ipython Shell中,如果我这样做 MyModule始终作为Class导入,因此我无法重新加载它(reload()仅适用于模块)。跑 再次似乎不更新类定义。有人可以建议一种在python shell
问题内容: 我需要以简单的Java独立应用程序从Web加载图像。有任何想法吗? 问题答案: 这足以启动您吗?不知道您要从那里做什么。
所以我是python的初学者,正在尝试制作仪表板。 我有一个文件夹,上面有我上传的照片。 结构: 我应该如何设置,以便我可以加载图片并将其放入
我在S3存储桶中有一堆针对不同环境的Springapplication.yml属性文件。我想从S3存储桶加载属性文件,以保证无状态配置。 如何让我的 spring-boot 应用程序加载这些属性,然后在应用程序启动时使其可用? 我使用的是Spring启动版本2.2.6.RELEASE和Java11。
问题内容: 我想让PyYAML的加载程序将映射(和有序映射)加载到Python 2.7+ OrderedDict类型中,而不是它当前使用的普通和对列表。 最好的方法是什么? 问题答案: 注意 :有一个基于以下答案的库,该库还实现了CLoader和CDumpers:Phynix / yamlloader 我非常怀疑这是最好的方法,但这是我想出的方法,并且确实有效。也可作为要点。
问题内容: 我熟悉以普通方式在jQuery中使用ajax。 我已经玩了一段时间了,但是不了解Wordpress使其正常工作需要 什么… 我在这里所摘录的内容来自一些教程或文章。 这在 functions.php中 (在子主题中): jQuery本身正在加载并正常工作。 我已经尝试过一些基本的ajax,如下所示: 除此之外,我不知道如何测试以确保它是否从一开始就正确地加载了…… 在这里的任何帮助,将