如何从子目录中自动加载DLL?

时间:2010-10-10 10:34:44

标签: c++ visual-studio dll

在Visual Studio中,您创建一个.dll项目,它会创建.dll和.lib文件。您静态链接到.lib,如果.dll与.exe位于同一文件夹中,一切正常。

我怀疑如果.dll在System32或任何其他PATH文件夹中,一切都会有效(请确认或更正)。

但问题是:我希望我的exe在./DLLS/文件夹中找到.dll,也就是说,如果我的exe在...... / MyApp / MyApp.exe中,那么它应该查找.dll在..... / MyApp / DLLS / MyDll.dll中。我不想在路径中包含DLLS文件夹。有什么方法可以做到这一点吗?

请注意,我不希望显式使用LoadLibrary,因此我无法在那里指定路径。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

以下是Win32应用程序在查找DLL时所经历的默认序列:

http://msdn.microsoft.com/en-us/library/7d83bc18(VS.80).aspx

因此,根据这一点,另一种方法可能是调用SetCurrentDirectory或SetDllDirectory。但为了使其工作,您必须使用延迟加载库功能(在Visual Studio的“项目设置”中指定)。延迟加载库意味着DLL仅在程序需要时加载,而不是在程序启动时自动加载。

答案 1 :(得分:2)

您可以使用SetDllDirectory。加载器将使用您在加载库时指定的其他目录。但是,只能有一个额外的目录,因此您需要确保在应用程序的稍后部分没有对此进行其他调用,否则将忽略您指定的目录。

如果该API不允许相关目录(我不确定),您总是可以使用NULL第一个参数调用GetModuleFileName来获取当前正在执行的程序的文件名。通过一点字符串操作,您可以获得DLL文件夹的绝对路径。

相关问题