添加自定义DLL搜索路径@ application startup

9 dll path setdlldirectory

我正在绞尽脑汁试图想出一个DLL加载问题的优雅解决方案.我有一个静态链接到其他加载DLL的lib文件的应用程序.我没有直接加载DLL.我想在可执行文件所在的文件夹之外的另一个文件夹中安装一些DLL.像%working_folder%\ dlls这样的东西 - 我宁愿在我的%working_folder%中没有几十个(是...几十个)DLL .

我正在尝试开发一些主要应用程序的一部分,它将调整搜索路径@ startup.我遇到的问题是这个新的自定义DLL路径不在系统搜索路径中.当我启动应用程序时它崩溃(STATUS_DLL_NOT_FOUND)因为必要的DLL不在适当的位置.我想做的是检查@ startup是否这个新的自定义DLL文件夹在进程环境变量搜索路径中,如果没有添加它.问题是,应用程序尝试在应用程序执行一行代码之前加载所有这些DLL.

我该如何解决?我考虑过编写一个首先启动的帮助应用程序,适当调整环境变量,然后通过CreateProcess启动主应用程序.这将有效我确信它,但它使开发人员的事情变得困难.当他们调试主应用程序时,他们不会首先启动帮助应用程序 - 而不是他们甚至可以做到这一点.

我已经尝试过注册表应用程序路径功能但没有成功.像以前一样鸡和鸡蛋问题.

我能在这做什么?

Ada*_*eld 3

[编辑 - 重新阅读问题后,我发现您遇到的问题是 DLL 在启动之前加载main]

\n\n

我猜测这些库是用 C++ 编写的,并且从全局范围内某些对象的构造函数加载 DLL。这是有问题的。请允许我引用Yossi Kreinin 的话:

\n\n
\n

首先在 main() 中执行此操作。如果您使用 C++,您应该在 main() 之前首先执行此操作,因为人们可以在全局变量的构造函数中使用 FP。这可以通过以下方式实现:确定特定于编译器的翻译单元初始化顺序、编译您自己的 C/C++ 启动库、使用 LD_PRELOAD 等内容覆盖已编译启动库的入口点、在静态链接程序中覆盖它就在二进制图像中,有一个编码约定,强制在使用 FP 之前调用 FloatingPointSingleton::instance(),或者拍摄那些喜欢在 main() 之前做事的人。这是一个权衡。

\n
\n\n

[原答案如下]

\n\n

请参阅本页了解用于加载 DLL 的搜索算法。您可以使用SetDllDirectory()将目录添加到 DLL 搜索路径。

\n\n

您还应该能够使用GetEnvironmentVariable()和将目录添加到 PATH 环境变量SetEnvironmentVariable()

\n\n

另一种选择是将当前工作目录更改为包含 DLL 的文件夹SetCurrentDirectory()。如果您使用相对文件名加载任何文件,请确保在加载 DLL 后将工作目录更改回原来的位置。

\n