Подтвердить что ты не робот

Получить путь к моим документам

Из Visual С++, как мне получить путь к папке "Мои документы" текущего пользователя?

Edit:

У меня есть это:

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

Однако result возвращается со значением E_INVALIDARG. Любые мысли о том, почему это может быть?

4b9b3361

Ответ 1

Это зависит от того, с какой возрастной системой вам нужна совместимость. Для старых систем есть SHGetSpecialFolderPath. Для несколько более новых систем существует SHGetFolderPath. Начиная с Vista, есть SHGetKnownFolderPath.

Вот некоторый демонстрационный код, который работает, по крайней мере, на моей машине:

#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;
}

Ответ 3

Обратите внимание, что CSIDL_PERSONAL не вернет нужную папку, если пользователь изменил папку сохранения по умолчанию в библиотеке документов Win7. Чтобы получить нужную папку, вам нужно использовать SHLoadLibraryFromKnownFolder для получения IShellLibrary для библиотеки документов, используйте IShellLibrary::GetDefaultSaveFolder, чтобы получить IShellItem для папки сохранения по умолчанию для библиотеки, и, наконец, используйте IShellItem::GetDisplayName, чтобы получить имя папки.

Ответ 4

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;

как насчет этого решения? Его работа прекрасна для меня.

Ответ 5

Использование Visual Studio 2017 с приложением MFC под Windows 10 Я использую следующий фрагмент кода с функцией SHGetKnownFolderPath для получения текущей папки "Документы" пользователя:

#include <string>     // include file for C++ native strings

//  . . .  other code.

PWSTR   ppszPath;    // variable to receive the path memory block pointer.

HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &ppszPath);

std::wstring myPath;
if (SUCCEEDED(hr)) {
    myPath = ppszPath;      // make a local copy of the path
}

CoTaskMemFree(ppszPath);    // free up the path memory block

Обратите внимание, что в документации сказано об использовании переменной пути и возвращенном пути:

ppszPath [out]

Тип: PWSTR *

Когда этот метод возвращает, содержит адрес указателя на строку Unicode с нулевым символом в конце, которая указывает путь к известной папке. Вызывающий процесс отвечает за освобождение этого ресурса, если он больше не нужен, вызывая CoTaskMemFree. Возвращенный путь не включает в себя обратную косую черту. Например, возвращается "C:\Users", а не "C:\Users \".

Список возможных аргументов FOLDERID_ см. В перечислении статьи MSN KNOWN_FOLDER_FLAG.