【问题标题】:Optimum way to help windows find the dll I'm linking to?帮助windows找到我链接到的dll的最佳方法?
【发布时间】:2012-10-12 16:00:48
【问题描述】:

我的代码使用的是静态/隐式链接 DLL(我们称之为 DLLB)的库,但在运行时找不到它。

尽管将 DLLB 定位在与调用它的代码相同的目录中。 (调用代码本身就是一个DLL,DLLA是从python调用的,它是从arcpy调用的。我不太确定为什么python能很好地找到DLLA,但DLLA却找不到DLLB,尽管它们在同一个目录中) .

如果我将库 DLL 放在系统路径的某个位置,一切正常。

但是最好的部署方法是什么?在安装时向客户端计算机上的系统路径添加一个条目?在加载DLL之前在运行时从python修改系统路径?还有什么?

【问题讨论】:

    标签: windows dll linker


    【解决方案1】:

    Python 必须在 LoadLibrary 调用中指定 DLL 的完整路径。这是推荐的做法。如果仅指定模块名称,则存在加载错误 DLL 的风险,可能会引入 binary planting vulnerability

    请注意,尽管默认搜索路径包括加载可执行文件的目录,但不包括加载其他 DLL 的目录。因此,您看到的行为符合预期。

    如果你可以使用动态加载,你可以查找DLLA的路径并使用它来构造DLLB的路径。

    要获取 DLLA 的模块句柄,请调用 GetModuleHandleEx。要从模块句柄获取 DLLA 的完整路径,请调用 GetModuleFileName。检查最后一个元素是否为 DLLA.dll 并将其替换为 DLLB.dll。然后您可以调用 LoadLibrary。

    【讨论】:

    • 你说得对,我在Python中指定了DLLA的全路径。 DLLB 是一个第三方库,可惜我认为它不支持动态加载。这留下了最好做的问题 - 修改系统路径?我能以某种方式只为 python 和它的 DLL 加载吗?
    • 您始终可以动态加载 DLL。 (嗯,几乎总是如此。)最可能的问题是更改 DLLA 中的代码以使用显式加载而不是隐式加载可能太难了。我认为最好的解决方案是在加载 DLLA 之前从 Python 显式加载 DLLB。然后隐式加载将找到正确的 DLL,因为它已经在内存中。但是,您可以改为使用 os.environ 映射对象修改进程的 PATH 环境变量。您可能希望将目录添加到 PATH 之前,但请确保其中没有任何会发生冲突的内容。
    • 好的 - 我现在使用显式链接,谢谢。但这真的是正确的做事方式吗?是否有可能注册 DLLB 以便任何寻找它的代码都可以使用它?
    • 一个更正式的解决方案(在这种情况下过度杀伤 IMO)是将 DLLB 注册为共享的并行程序集(即,将其安装到 WinSxS 中)并将清单应用于 DLLA。我对这种方法不是很熟悉,但请参阅msdn.microsoft.com/en-us/library/dd408052%28v=vs.85%29.aspx
    猜你喜欢
    • 2016-11-13
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多