3

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

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

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

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

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

4

2 回答 2

11

它很可能会失败,因为您在第二次调用 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 的能力。阅读上面的 MSDN 页面,并考虑查看各种选项调用,例如LoadLibraryExSetDllDirectory可以使搜索路径更易于处理。这个页面也是关于 DLL 搜索路径的。

于 2013-02-25T09:00:49.837 回答
2

首先,我假设您打算写:

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

文档回答了您的问题:

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

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

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

于 2013-02-25T09:22:36.030 回答