C++ LoadLibraryA和相对路径
我正试图通过LoadLibraryA从另一个dll加载dll。 这就是问题所在:C++ LoadLibraryA和相对路径,c++,windows,winapi,dll,C++,Windows,Winapi,Dll,我正试图通过LoadLibraryA从另一个dll加载dll。 这就是问题所在: c:\**EXE_DIR**\myExe.exe // this exe load the MY_DLL_N1.dll c:\**DLLS_DIR**\MY_DLL_N1.dll // this dll load the MY_DLL_N2.dll c:\**DLLS_DIR**\MY_DLL_N2.dll exe加载MY_DLL_N1.DLL。。。好的 MY_DLL_N1.DLL尝
c:\**EXE_DIR**\myExe.exe // this exe load the MY_DLL_N1.dll
c:\**DLLS_DIR**\MY_DLL_N1.dll // this dll load the MY_DLL_N2.dll
c:\**DLLS_DIR**\MY_DLL_N2.dll
exe加载MY_DLL_N1.DLL。。。好的
MY_DLL_N1.DLL尝试在代码下面加载MY_DLL_N2.DLL相同的目录。。。这就是我的问题!
就这些。。。。欢迎任何帮助 您需要知道的所有信息都位于此处:
考虑使用将DLL路径添加到LoadLibrary搜索路径 您需要知道的所有信息都位于此处:
handle = LoadLibraryA ("MY_DLL_N2.dll");
考虑使用将DLL路径添加到LoadLibrary搜索路径
handle = LoadLibraryA ("MY_DLL_N2.dll");
由于未提供路径,因此使用。这将在可执行文件的目录中查找,但不会在加载的任何DLL的目录中搜索。因此,无法找到DLL
您有许多选择:
将所有DLL与可执行文件放在同一目录中。
调用LoadLibrary时传递DLL的完整路径。
调用将DLL目录添加到搜索路径。在加载第一个DLL之前,从可执行文件进行此调用。一旦这样做了,在加载第一个DLL时就不需要使用完整路径。
除非您需要在不同的应用程序之间共享DLL,否则始终首选选项1。这使您可以轻松地确保加载的DLL是正确的。这是因为始终首先搜索可执行目录
由于未提供路径,因此使用。这将在可执行文件的目录中查找,但不会在加载的任何DLL的目录中搜索。因此,无法找到DLL
您有许多选择:
将所有DLL与可执行文件放在同一目录中。
调用LoadLibrary时传递DLL的完整路径。
调用将DLL目录添加到搜索路径。在加载第一个DLL之前,从可执行文件进行此调用。一旦这样做了,在加载第一个DLL时就不需要使用完整路径。
除非您需要在不同的应用程序之间共享DLL,否则始终首选选项1。这使您可以轻松地确保加载的DLL是正确的。这是因为始终首先搜索可执行目录 您希望Windows为您找到正确的DLL,这是在要求DLL地狱。你明白了。Windows无意解决此问题。将DLL存储在与EXE相同的目录中应该始终是首选。故意把它们放在其他地方让另一个程序使用相同的DLL是最糟糕的DLL地狱。您将更新DLL以修复一个程序中的错误。并在另一个程序中引发错误。不要这样做。你希望Windows为你找到合适的DLL,这是在要求DLL地狱。你明白了。Windows无意解决此问题。将DLL存储在与EXE相同的目录中应该始终是首选。故意把它们放在其他地方让另一个程序使用相同的DLL是最糟糕的DLL地狱。您将更新DLL以修复一个程序中的错误。并在另一个程序中引发错误。不要这样做。AppPath有什么相关性?据我所知,它们不会影响DLL搜索。我错了吗?@DavidHeffernan-你是对的。答案已调整。另一个选项是使用GetModuleFileName获取加载MY_DLL_N1.DLL的完整路径,将文件名与MY_DLL_N2.DLL交换,并将新的完整路径传递到LoadLibrary。那么你就不必担心搜索路径了。AppPath有什么关系呢?据我所知,它们不会影响DLL搜索。我错了吗?@DavidHeffernan-你是对的。答案已调整。另一个选项是使用GetModuleFileName获取加载MY_DLL_N1.DLL的完整路径,将文件名与MY_DLL_N2.DLL交换,并将新的完整路径传递到LoadLibrary。那么,您根本不必担心搜索路径。