Как правильно использовать%USERPROFILE% внутри кода?

Мой код правильный? Кажется, может скомпилировать, но не работает должным образом..

CString testing = _T(" --url=") + cstring + _T(" --out=%USERPROFILE%\\snapshot.png");

Я хочу указать на папку пользователя.. но все еще не может работать.

2 ответа

Решение

Ответ в том, что вы вообще не используете переменные окружения. Скорее, вы используете функции оболочки, специально предназначенные для получения пути к специальным папкам.

В Windows Vista и более поздних версиях эта функция SHGetKnownFolderPath, Занимает KNOWNFOLDERID значения, чтобы определить папку, путь которой вы хотите получить. В вашем случае это было бы FOLDERID_Profile,

Если вам нужно настроить таргетинг на более ранние версии Windows (например, XP), вам нужно будет использовать SHGetSpecialFolderPath вместо этого Он принимает значение CSIDL, определяющее папку, путь которой вы хотите получить. Опять же, в вашем случае это было бы CSIDL_PROFILE,


Конечно, вы никогда не должны хранить данные непосредственно в папке профиля пользователя. Так что, надеюсь, фрагмент кода, который вы показали, предназначен только для демонстрационных целей. Приложения должны создавать файлы только в определенных местах в папке профиля пользователя, предназначенной для хранения данных приложения.

Эти места CSIDL_APPDATA или же CSIDL_LOCAL_APPDATA, Если вы создаете данные, которые пользователь должен иметь возможность изменять и обрабатывать как свои собственные, то было бы целесообразно сохранить эти данные в папке документов пользователя (CSIDL_MYDOCUMENTS).

Больше информации об использовании доступно в моем ответе здесь.


Образец кода:

TCHAR szFolderPath[MAX_PATH];
if (!SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_APPDATA, FALSE))
{
    // Uh-oh! An error occurred; handle it.
}

Или, используя MFC CString учебный класс:

CString buffer;
BOOL bRet = SHGetSpecialFolderPath(NULL, buffer.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
buffer.ReleaseBuffer();
if (!bRet)
{
    // Uh-oh! An error occurred; handle it.
}

Как предположил Коди, лучше использовать функцию SHGetSpecialFolderPath. Однако вы можете использовать функцию GetEnvironmentVariable, чтобы получить эту и другие переменные, установленные в системе.

TCHAR szBuf[MAX_PATH] = {0};
::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);
Другие вопросы по тегам