LoadLibrary() relative address to dll
我正在尝试在Windows中的代码中加载dll,我使用LoadLibrary()函数成功加载了dll,但是我有一个问题,我给出了dll的路径,如下所示:
1 | LoadLibrary(C:\\\\path\\\\to\\\\my\\\\dll); |
我想知道我是否可以提供dll的相对路径。我的意思是例如:
1 | LoadLibrary(.\\my dll directory\\my dll.dll) |
有可能吗?如果没有,如何在不更改其他计算机中dll路径的情况下开发可移植的项目?
最有可能失败的原因是您在第二次调用LoadLibrary时忘记了转义反斜杠。写下问题时可能是错字,因为您也忘记了文件名的引号。 ;)也就是说,更改此行:
1 | LoadLibrary(.\\my dll directory\\my dll.dll); |
要这样:
1 | LoadLibrary(L".\\\\my dll directory\\\\my dll.dll"); |
(而且我不确定是否需要前导
如果这不能解决问题,那么很可能会满足您的需求:
1 2 3 4 | 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搜索路径也是如此。
首先,我假设您要编写:
1 | LoadLibrary(".\\\\my dll directory\\\\my dll.dll"); |
文档回答了您的问题:
If a relative path is specified, the entire relative path is appended to every token in the DLL search path list. To load a module from a relative path without searching any other path, use GetFullPathName to get a nonrelative path and call LoadLibrary with the nonrelative path.
是的,您可以指定相对路径。但是它的解释方式可能不是您所期望的。 DLL搜索将依次采用DLL搜索路径中的每个路径,并将其与您的相对路径合并,然后尝试加载该DLL。
因此,如果您希望相对路径相对于当前工作目录,请调用