我正在使用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 !№;%()_@#$^&"
有什么特别之处?我该如何解决?
答案 0 :(得分:5)
问题不在于使用国际字符。问题是分号。无论出于何种原因,SetDllDirectory
不接受您提供的路径中的分号。我找不到任何关于为什么会这样的文档,但很容易检查它是如此。
SetDllDirectoryW(L"aa")
会成功,但
SetDllDirectoryW(L"a;a")
会失败。
AddDllDirectory
也是如此。任何包含分号的路径都会被拒绝。
我的猜测是,内部Windows将此信息存储在单个字符串中,使用分号作为分隔符。因此,这些函数必须拒绝包含分号的路径。