Функция C ++ ExpandEnvironmentStringsForUser иногда возвращает неправильное значение - PullRequest
0 голосов
/ 21 февраля 2019

Я использую ExpandEnvironmentStringsForUser , чтобы расширить каталог, который включает переменную среды.Однако возвращаемое значение иногда неверно.

Мой процесс выполняется с системной привилегией.

Например:

  • Входная строка: "C: \Пользователи \% username% \ Documents \ "

  • Выходная строка (возможно, одна из следующих строк)

C: \ Users \ cuong.huynh\ Documents \ (ожидаемый вывод)

C: \ Users \ cuong.huynh \ AppData \ Roaming (неверно)

C: \ Program Files \ Common Files (неверно)

Мой краткий код выглядит следующим образом:

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 голосов
/ 21 февраля 2019
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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...