在另一个指定文件夹中收集DLL?

Jer*_*dge 4 delphi dll delphi-7

首先,请原谅我不知道正确的术语,我确信有一个非常常见的技术名称,我可以简单地谷歌寻求帮助 - 但如果我不知道这个术语,我找不到帮助首先.

我正在Delphi 7中构建一个模块化系统.有一些应用程序和一堆DLL.所有应用程序共享这些DLL,以及一些DLL使用其他DLL.DLL目前保存在与应用程序相同的位置.我想把所有这些DLL放在子文件夹(EXE的其他地方),但当然德尔福不知道如何找到它们.

有没有办法可以指示我的Delphi应用程序在DLL的某个目录中查找?它不能使用Contstants,因为可以选择指定DLL的存储位置.

这些DLL只是每个StdCall函数的简单集合,没什么特别的.

编辑:

解释为什么我要将DLL保存在他们自己的文件夹中的原因:我正在构建的这个系统将这些DLL视为附加组件.默认情况下,系统可能甚至没有任何加载项.另一方面,它还允许各个供应商构建其他DLL并将它们作为附加组件包含在内.然后,需要这些附加组件的每个应用程序将被定向到找到它们的文件夹.它自己的应用程序将拥有自己的DLL,它将与应用程序位于同一目录中.但供应商的DLL我想保持独立.

正如下面的答案所述,我最好的选择是实现DLL导入方法,因为A)我可以为它导入的每个DLL指定路径,B)我可以更好地控制每个DLL的使用(是否需要是否加载?)和C)每个DLL在技术上可以单独放在不同的文件夹中(供应商可能想要构建自己的文件夹结构).该系统仍然非常成熟,但我计划进一步提高灵活性.

Rem*_*eau 5

如果您在代码中动态加载DLL,则可以随意存储它们,因为LoadLibrary/Ex()无论如何都必须传递完整路径.如果您静态链接到DLL,则可以使用SetDllDirectory()指定要包含在OS的DLL搜索路径中的其他路径.


Dav*_*nan 4

您可以使用 PATH 执行此操作,但我建议您不要这样做。这是一种残酷且不灵活的方法。当然,您需要更改系统范围的 PATH 才能在可执行文件加载时产生任何影响。

LoadLibrary您可以使用和显式加载 DLL GetProcAddress。如果有大量进口,那就没什么意思了,但否则它可能是一个不错的选择。请记住,如果您沿着这条路线走下去,每个 DLL 都必须切换到显式链接。

有一种叫做DLL 重定向的东西,但微软不建议你使用它。他们建议您使用并排组件。话虽如此,Visual Studio 团队在 VS2010 中放弃了使用 MSVC 运行时的并行组件,因为并行组件在之前的版本中带来了麻烦。

因此,尽管有所有选项,我确实相信最好的解决方案是将所有 DLL 放在与可执行文件相同的目录中。如果你能克服看起来凌乱的文件夹,那么生活就会变得更加简单。这是解决问题的一个微不足道的不费力的解决方案。

更新

对您的问题的更新提供了这些 DLL 是可选附加组件的额外信息。在这种情况下,您别无选择,只能使用LoadLibrary和的显式链接GetProcAddress