我正在使用 SetDllDirectory(实际上是 SetDllDirectoryW)从特定目录加载一些延迟加载的库。
它就像

if (SetDllDirectory(directory.c_str()) == 0)
{
    ERROR_MSG("Failed to set the current dll directory [%d]\n", GetLastError());
}

所以一切正常,大多数时候,"f:/source/trunk 11" 很好,等等
但是当它用 "f:/source/trunk Gest hieß es !№;%()_@#$^&" 调用时,我从 GetLastError 得到 ERROR_INVALID_PARAMETER。我可以用这样的名字创建一个目录,我可以使用它。
但是 SetDllDirectory"Gest hieß es !№;%()_@#$^&" 有什么特别之处呢?我该如何解决?

最佳答案

问题不在于使用国际字符。问题是分号。无论出于何种原因, SetDllDirectory 都不接受您提供的路径中的分号。我找不到任何关于为什么会这样的文档,但是很容易检查它是否如此。

SetDllDirectoryW(L"aa")

会成功,但是
SetDllDirectoryW(L"a;a")

将失败。
AddDllDirectory 也是如此。任何包含分号的路径都会被拒绝。

我的猜测是 Windows 在内部将此信息存储在单个字符串中,使用分号作为分隔符。正因为如此,这些函数必须拒绝包含分号的路径。

关于c++ - SetDllDirectory 因某些 unicode 符号而失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25740645/

10-11 14:37