【问题标题】:How can I make a separate folder for my application's DLLs?如何为我的应用程序的 DLL 创建一个单独的文件夹?
【发布时间】:2011-07-05 14:34:15
【问题描述】:

我已成功地将一个大型 MFC 项目划分为几个较小的 DLL 项目。现在我想在我的应用程序文件夹中有一个名为“DLL”的单独文件夹,其中放置了子项目中的所有 DLL。

谁能指导我如何实现这一目标?

【问题讨论】:

  • 为什么需要将 DLL 放在单独的文件夹中?为什么不能将它们包含在与 EXE 相同的文件夹中?
  • 我有大约 200 个 dll 文件,当我打开应用程序文件夹时,它是如此混乱
  • 我不会将 200 个 DLL 文件称为“几个较小的 DLL 项目”。更重要的是,应用程序文件夹的内容不应该真正相关。用户很少直接与文件夹中的应用程序交互。他们单击图标或使用“开始”菜单。如果您有一个设计良好的安装程序,这应该不是问题。
  • 你真的不明白我想说什么。因为我有 200 个 dll 文件,所以很难维护这么大的项目

标签: c++ visual-studio visual-c++ dll mfc


【解决方案1】:

如果您使用 LoadLibrary,您只需明确指定您加载的 DLL 的完整路径。

如果 DLL 是隐式链接的,您可以通过两种方式执行此操作。

  • 让安装程序修改 PATH 变量。这是侵入性和“不良形式”
  • 编写一个“加载器”应用程序,在本地修改路径变量,然后执行真正的可执行文件。

最好的解决方案是简单地将 DLL 与可执行文件放在同一目录中。

【讨论】:

  • 尊重我不想要
  • 那么,可以临时修改%PATH%变量吗?
【解决方案2】:

DLL 重定向是一个相当新的功能(Windows 2000 IIRC)。将您的 DLL 目录命名为 <myapp>.exe.local,Windows 将首先检查它是否有通过 LoadLibrary(Ex) 加载的任何内容。这包括延迟加载的 DLL。

【讨论】:

  • 有关该类型重定向的更多信息,请参阅this article
  • 良好的链接。所以目录形式是XP,不是2000。
  • 嗯,Windows 2000 中对.local 有一些支持,但我不记得具体是什么了。我认为它可能仅限于 COM 组件或其他东西。但是side-by-side assemblies 直到 XP 才被引入。
【解决方案3】:

编辑:正如 Eric 所指出的,这不起作用。抱歉。

Dynamic-Link Library Search Order。简而言之,您可以使用“HKEY_LOCAL_MACHINE\SORTWARE\Microsoft\Windows\CurrentVersion\App Paths”项下的注册表项来执行此操作。 如下所示的 reg 文件显示了如何:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe]
@="C:\\Program Files\\MyCompany\\MyApp\\MyApp.exe"
"Path"="C:\\Program Files\\MyCompany\\MyApp\\MyDLLs"

【讨论】:

  • 在您链接到的文档中推荐使用该注册表项的位置?
  • 根据您链接的页面:“计算DLL搜索路径时不使用App Paths键。”
  • @Erik:看起来你是对的。 “安全搜索顺序”(在现代版本的 Windows 上默认启用)似乎打破了这种技术。它曾经工作过。我应该更仔细地阅读我自己的链接。
  • 不,即使 SafeDllSearchMode 被禁用,链接也会说同样的话:“计算 DLL 搜索路径时不使用 App Paths 键。”
  • 嗨,史蒂夫。事实上,你可以这样做:stackoverflow.com/a/36644602/321013 ...多年来我一直认为这也是不可能的,但它确实有效。
猜你喜欢
  • 2015-01-22
  • 2022-01-05
  • 2016-10-14
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2011-12-08
  • 2013-08-08
相关资源
最近更新 更多