std::basic_string::c_str()
возвращает константный буфер в свою память.Если вы хотите изменить строку, вам придется сделать что-то вроде этого:
wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.erase(
std::find(wstrPath.begin(), wstrPath.end(), L'\0'), wstrPath.end()
); //Throw away unused buffer space
РЕДАКТИРОВАТЬ: должно также работать, если вы не боитесь библиотек C (хотяЯ не проверял это, как я проверял реализацию выше):
wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.resize(wcslen(wstrPath.c_str()));