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