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!

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top