LoadLibrary()与dll的相对地址

时间:2013-02-25 08:44:00

标签: c++ windows visual-studio-2010 winapi dll

我正在尝试在Windows中的代码中加载一个dll,我使用LoadLibrary()函数成功加载我的dll但是我有一个问题,我给了我的dll路径:

LoadLibrary(C:\\path\\to\\my\\dll);

我想知道我是否可以给出我的dll的相对路径。我的意思是例如:

LoadLibrary(.\my dll directory\my dll.dll)

有可能吗?如果没有,我如何开发我的项目,它可以移植而不改变不同机器中的dll路径?

2 个答案:

答案 0 :(得分:10)

最有可能失败的原因是你在第二次调用LoadLibrary时忘了逃避反斜杠。写问题时,这可能是一个错字,因为你也忘记了文件名的引号。 ;)即改变这一行:

LoadLibrary(.\my dll directory\my dll.dll);

要成为这样:

LoadLibrary(L".\\my dll directory\\my dll.dll");

(我不确定是否需要领先的.\\

如果这不能解决问题,那么这很可能会满足您的需求:

wchar_t szFullPath[MAX_PATH] = {};
GetCurrentDirectory(MAX_PATH, szFullPath);
PathCchAppend(szFullPath, MAX_PATH, L"my dll directory\\my dll.dll");
HMODULE hDLL = LoadLibrary(szFullPath);

最后,LoadLibrary具有不同的搜索依赖DLL的行为。它根据您指定路径的方式而有所不同。这可能会影响您从相对搜索路径加载DLL的能力。 Read the MSDN page on it并考虑查看各种选项,例如LoadLibraryExSetDllDirectory可以使搜索路径更易于处理。 {DLL}搜索路径上的This page

答案 1 :(得分:2)

首先,我假设您打算写:

LoadLibrary(".\\my dll directory\\my dll.dll");

documentation回答了您的问题:

  

如果指定了相对路径,则整个相对路径将附加到DLL搜索路径列表中的每个标记。要从相对路径加载模块而不搜索任何其他路径,请使用GetFullPathName获取非相对路径并使用非相对路径调用LoadLibrary。

所以是的,您可以指定相对路径。但它的解释方式可能不是你所期待的。 DLL搜索将依次获取DLL搜索路径中的每个路径,将其与您的相对路径组合,并尝试加载该DLL。

因此,如果您希望相对路径相对于当前工作目录,请调用GetFullPathName将其扩展为绝对路径,然后加载该路径。如果希望相对路径相对于其他目录进行解释,则与该目录结合并使用绝对路径加载DLL。