C ++ ExpandEnvironmentStringsForUser函数somtimes返回错误的值

时间:2019-02-21 03:43:41

标签: c++ windows winapi

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

有人知道输出不稳定的原因吗?

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);