Получить каталог документов - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над небольшим однопользовательским читом для игры и планирую сделать его общедоступным, я написал API, и все это работает хорошо, но я хочу сохранить данные, которые пользователь вводит в файл .ini, чтобычто они должны будут войти в систему только один раз, если их учетные данные не изменятся.Я сделал это, и он работает с относительным путем C:\Users\Name\Documents\Cheat\Authorise.ini Хотя Когда проверяете результат, кажется, что он не сохраняет и не читает данные в файле.

Мне интересно, есть ли лучшийспособ получить каталог документов.

Функция:

std::string authFile = "C:\\Users\\%USERNAME%\\Documents\\Cheats\\Authorise.ini";
std::string username = GUI::Files::ReadStringFromIni(authFile, "Login", "Username");
std::string password = GUI::Files::ReadStringFromIni(authFile, "Login", "Password");`

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Различные версии Windows хранят профили пользователей в разных местах, и даже имя папки по умолчанию Documents может отличаться.Фактически, имя и местоположение папки Documents пользователя полностью настраиваются пользователем и могут даже вообще не находиться под профилем пользователя.Поэтому не следует полагать, что папка Documents всегда находится в C:\\Users\\%USERNAME%\\Documents.

. Лучший способ получить правильный путь к папке пользователя Documents во всех версияхWindows просто спросит у самой Windows .Для этого используйте SHGetFolderPath(CSIDL_MYDOCUMENTS) (до Vista) или SHGetKnownFolderPath(FOLDERID_Documents) (Vista +), например:

#include <shlobj.h>
#include <shlwapi.h>

std::string GetDocumentsFolder()
{
    std::string path;

    char szPath[MAX_PATH+1] = {};
    if (SHGetFolderPathA(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, szPath) == S_OK)
        path = PathAddBackslashA(szPath);

    /*
    PWSTR pPath = NULL;
    if (SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_DEFAULT, NULL, &pPath) == S_OK)
    {
        int wlen = lstrlenW(pPath);
        int len = WideCharToMultiByte(CP_ACP, 0, pPath, wlen, NULL, 0, NULL, NULL);
        if (len > 0)
        {
            path.resize(len+1);
            WideCharToMultiByte(CP_ACP, 0, pPath, wlen, &path[0], len, NULL, NULL);
            path[len] = '\\';
        }
        CoTaskMemFree(pPath);
    }
    */

    return path;
}

std::string GetAuthFilePath()
{
    std::string path = GetDocumentsFolder();
    if (!path.empty())
        path += "Cheats\\Authorise.ini";
    return path;    
}

std::string authFile = GetAuthFilePath();
...
0 голосов
/ 06 февраля 2019

Поскольку вы работаете в Windows, вы должны использовать вызов API Windows, доступный для этой цели в <ShlObj.h>, который называется SHGetKnownFolderPath.Обратите внимание, что для этой цели лучше всего использовать std::wstring, поскольку не существует варианта SHGetKnownFolderPath, который принимает строку MBCS или ANSI.Кроме того, вы получите полный путь к каталогу профиля пользователя, а не только имя пользователя.

PWSTR path;
SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_DEFAULT, NULL, &path);
std::wstring strpath(path);
CoTaskMemFree(path);

Кроме того, как только вы закончите с path, освободите его с помощью CoTaskMemFree.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...