C ++: std :: wstring en función de la API
Pregunta
Estoy usando el SHGetSpecialFolderLocation función de la API. Mi solicitud se ajusta a "Uso grupo de caracteres Unicode".
Esto es lo que tengo hasta ahora:
int main ( int, char ** )
{
LPITEMIDLIST pidl;
HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl);
/* Confused at this point */
wstring wstrPath;
wstrPath.resize ( _MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, wstrPath.c_str () );
/* End confusion */
El error que estoy recibiendo es:
error C2664: 'SHGetPathFromIDListW' : cannot convert parameter 2 from 'const wchar_t *' to 'LPWSTR'
alguien ayuda Can? ¿Cuál es la correcta C ++ manera de hacer esto?
Gracias!
Solución
El segundo parámetro es un a cabo parámetro, por lo que no se puede simplemente pasar c_str
(que es const
) directamente. Probablemente sería más simple justo hacer
wchar_t wstrPath[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, wstrPath);
MAX_PATH
es actualmente de 260 caracteres.
Otros consejos
retornos wstring::c_str()
const wchar_t*
y es sólo lectura . LPWSTR
no es un tipo const
, y que parámetro es un parámetro de salida. Usted tendrá que asignar el almacenamiento intermedio a sí mismo. Se podría hacer algo como esto:
wchar_t buf[MAX_PATH] = {0};
BOOL f = SHGetPathFromIDList( pidl, buf );
wstring wstrPath = buf;
Se puede obtener la dirección del elemento de la matriz primero en basic_string como puntero a los datos de cadena de escritura. Aunque estándar C ++ no garantiza que este bloque de memoria debe ser continua esto es seguro en todas las implementaciones conocidas ( ¿Qué tan grave es el código usando std :: basic_string como un amortiguador contigua ).
std::wstring path(_MAX_PATH, L'\0');
BOOL f = SHGetPathFromIDList(pidl, &path[0]);
retornos std::basic_string::c_str()
un constante a amortiguar su memoria. Si desea modificar la cadena, que tendría que hacer algo como esto:
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
EDIT: Este debe también trabajo si no tienes miedo de bibliotecas de C (aunque no he probado como que he probado la aplicación anterior):
wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.resize(wcslen(wstrPath.c_str()));
wstring :: c_str () no le permiten modificar su buffer interno de esta manera. Su solución más fácil es crear un buffer wchar_t a sí mismo, y el paso que al constructor wstring:
wchar_t buf[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, buf );
wstring wstrPath(buf);