我正在使用 ExpandEnvironmentStringsForUser 函数来扩展包含环境变量的目录。 但是,有时返回的值是错误的。
我的进程正在以系统特权运行。
例如:
输入字符串:“ C:\ Users \%username%\ Documents \”
输出字符串(可能是以下字符串之一)
C:\ Users \ cuong.huynh \ Documents \(预期输出)
C:\ Users \ cuong.huynh \ AppData \ Roaming(错误)
C:\ Program Files \ Common文件(错误)
我的简短代码如下:
DWORD dwSessionID = WTSGetActiveConsoleSessionId();
WTSQueryUserToken(dwSessionID, &hUserToken);
DuplicateToken(hUserToken, SecurityImpersonation, &hDuplicated)
hToken = hDuplicated;
LPCWSTR DesPath = (StringUtil::StrToWstr(setting)).c_str(); //(input)
wchar_t ExpandedDesPath[MAX_PATH]; //(output)
ExpandEnvironmentStringsForUser(hToken, DesPath, ExpandedDesPath, MAX_PATH - 1)
有人知道输出不稳定的原因吗?
答案 0 :(得分:1)
LPCWSTR DesPath = (StringUtil::StrToWstr(setting)).c_str();`
这将创建一个临时 wstring
,该值在分配DesPath
后立即超出范围,使DestPath
悬空并指向无效的内存。您需要先将StrToWstr()
的结果存储到本地wstring
,然后再对它调用c_str()
,这样字符串内存才在作用域内:
wstring wstr = StringUtil::StrToWstr(setting);
LPCWSTR DesPath = wstr.c_str();
否则,直接在StrToWstr().c_str()
的输入参数中调用ExpandEnvironmentStringsForUser()
:
ExpandEnvironmentStringsForUser(hToken, StringUtil::StrToWstr(setting).c_str(), ExpandedDesPath, MAX_PATH - 1);