我正在使用 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/