gpt4 book ai didi

dll - LoadLibrary() 无法使用 list 和私有(private)程序集加载 DLL

转载 作者:行者123 更新时间:2023-12-03 17:04:01 24 4
gpt4 key购买 nike

我正在开发一个使用多个 DLL 的 Windows 应用程序 (EXE)。开发在 VCExpress 2005 (VC 8.0) 中,仅使用 C。

其中一些 DLL 是使用 LoadLibrary 动态加载的插件/附加组件/扩展。根据EXE读取的配置文件。

重要的是:应用程序必须是可移植的(即无需安装即可从 USB 闪存驱动器或类似设备运行),并且插件 DLL 可能与应用程序 EXE 不在同一文件夹中(遗留原因)。

使用 MSVC6,这很简单:编译、链接、分发 EXE 和 DLL。

使用 MSVC8,C 运行时库 (MSVCRT) 不再随操作系统分发,因此不能依赖它的安装。为了满足便携性要求,我需要使用 private assembly .所有的 EXE 和 DLL 都嵌入了它们的 list 。

我的问题 : 通过 LoadLibrary() 加载的插件 DLL找不到 EXE 文件夹中的私有(private)程序集,因此尝试加载它们会失败,除非 Microsoft.VC80.CRT程序集安装在 winSxS 中。

渔获 :如果从插件 DLL 中删除 list ,一切正常。

我的问题 :

  • 在问题案例中,Windows 似乎没有遵循 Assembly searching sequence。或 Dynamic link library search order .具体来说,它是在加载 DLL 的路径中查找私有(private)程序集,而不是从加载应用程序 (EXE) 的路径中查找私有(private)程序集。
    我试图通过将程序集与 DLL 相邻并更改当前目录(以排除与工作目录相关的情况)来验证这一点,并获得预期的行为。任何人都可以确认这是使用 LoadLibrary 时的正常行为吗?与 SxS?
  • 我是否正确假设没有 list ,DLL 会退回到非 SxS 加载顺序,即找到 msvcr80.dll (而不是程序集 list Microsoft.VC80.CRT.manifest )在 EXE 的文件夹中?
  • 如果我对 (1) 和 (2) 的看法是正确的,那么仅仅从 DLL 中排除 list 会失去什么?换个说法,为什么我不应该通过排除 list 来解决我的问题?
  • 最佳答案

    您需要了解什么是激活上下文才能理解此问题。

    带有 list 的 exe 或 dll 具有激活上下文 - 激活上下文是在解析 list 时发现的窗口类、依赖程序集、dll 和无注册 com 引用的列表。

    没有 list 的 exe 或 dll 使用进程默认激活上下文 - 如果 exe 具有激活上下文,则通常是 exe 的激活上下文。

    在您的情况下,dll 有自己的激活上下文 - 因为它有一个 list 。它始终是搜索程序集的(包含该文件/文件夹) list 文件的路径。

    这就是为什么windows首先在dll的文件夹中搜索私有(private)程序集的原因。然后,当失败时,Windows 会在标准加载库搜索路径中搜索 dll:从 exe 的根文件夹开始。但是它现在搜索 dll,而不是程序集 - 所以找不到包含 dll 的程序集文件夹。

  • 没有。没有 list ,dll 会退回到使用默认激活上下文:exe 的 list 。 This Blog Article稍微解释一下。
  • 排除 list 。您失去的是让 dll 指定其自己的依赖程序集的能力。因此,您需要做的是将 dll 需要的任何依赖程序集添加到应用程序 list 中。
  • 关于dll - LoadLibrary() 无法使用 list 和私有(private)程序集加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2335476/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com