2010-03-10 21 views
10

Desde Visual C++, ¿cómo puedo obtener la ruta a la carpeta del usuario actual Mis documentos?Obtener ruta a Mis Documentos

Editar:

tengo esto:

TCHAR my_documents[MAX_PATH]; 
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents); 

Sin embargo, result vuelve con un valor de E_INVALIDARG. ¿Alguna idea de por qué esto podría ser?

Respuesta

14

Depende de la antigüedad de un sistema con el que necesite compatibilidad. Para sistemas antiguos, hay SHGetSpecialFolderPath. Para sistemas algo más nuevos, hay SHGetFolderPath. Comenzando con Vista, hay SHGetKnownFolderPath.

Editar: Desea utilizar CSIDL_PERSONAL, no CSIDL_MYDOCUMENTS. código de demostración que funciona, al menos en mi máquina:

#include <windows.h> 
#include <iostream> 
#include <shlobj.h> 

#pragma comment(lib, "shell32.lib") 

int main() { 
    CHAR my_documents[MAX_PATH]; 
    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents); 

    if (result != S_OK) 
     std::cout << "Error: " << result << "\n"; 
    else 
     std::cout << "Path: " << my_documents << "\n"; 
    return 0; 
} 
+0

Gracias. He intentado SHGetFolderPath, y algo no funciona del todo. ¿Te importaría echar un vistazo a mi edición en la pregunta? – Smashery

+0

¡Muchas gracias! – Smashery

+0

Esto parece ser un pitón incorporado ahora. http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo

8

Utilice the SHGetFolderPath Windows API function y solicite CSIDL_MYDOCUMENTS.

+0

Creo que el enlace no es correcto, corregir: http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx – uray

+0

Gracias - Lo he intentado, y algo no es del todo trabajando, ¿te importaría echar un vistazo a mi edición en la pregunta? – Smashery

1

Tenga en cuenta que CSIDL_PERSONAL no devolverá la carpeta deseada si el usuario ha cambiado la carpeta predeterminada para guardar en la biblioteca Documentos Win7. Para obtener la carpeta correcta, necesita usar SHLoadLibraryFromKnownFolder para obtener el IShellLibrary para la biblioteca Documentos, use IShellLibrary::GetDefaultSaveFolder para obtener IShellItem para la carpeta de guardado predeterminada de la biblioteca, y finalmente use IShellItem::GetDisplayName para obtener el nombre de la carpeta.

1
std::string GetSystemFolderPaths(int csidl) 
{ 
    wchar_t Folder[1024]; 
    HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, Folder); 
    if (SUCCEEDED(hr)) 
    { 
     char str[1024]; 
     wcstombs(str, Folder, 1023); 
     return str; 
    } 
    else return ""; 
} 

cout<<GetSystemFolderPaths(CSIDL_MYDOCUMENTS)<<endl; 

¿qué tal esta solución? esta trabajando bien para mi.

+0

Parece que no estás usando el argumento csidl. Si lo entendí bien, probablemente debería colocarse como el segundo argumento de SHGetFolderPathW() en lugar de CSIDL_MYDOCUMENTS. – BrunoLevy

Cuestiones relacionadas