LoadLibrary()到dll的相对地址

LoadLibrary() relative address to dll

本文关键字:相对地址 dll LoadLibrary      更新时间:2023-10-16

我正试图在windows中的代码中加载一个dll,我用LoadLibrary((函数成功加载了我的dll,但我有一个问题,我给出了我的dll的路径,如:

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

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

LoadLibrary(.my dll directorymy dll.dll)

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

它很可能失败,因为您在对LoadLibrary的第二次调用中忘记了转义反斜杠。也许这是写问题时的拼写错误,因为你也忘记了文件名的引号。(也就是说,更改这一行:

LoadLibrary(.my dll directorymy 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的能力。阅读上面的MSDN页面,并考虑查看LoadLibraryEx和SetDllDirectory等各种选项调用,以使搜索路径更容易处理。这个页面上的DLL搜索路径。

首先,我假设您打算写:

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

文档回答了您的问题:

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

因此,可以指定一个相对路径。但它的解释方式可能不是你所期望的。DLL搜索将依次获取DLL搜索路径中的每个路径,将其与相对路径相结合,然后尝试加载该DLL。

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