Как правильно использовать% USERPROFILE% внутри кода? - PullRequest
2 голосов
/ 26 июля 2011

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

Ответы [ 2 ]

10 голосов
/ 26 июля 2011

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

В 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.
}
1 голос
/ 27 июля 2011

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

TCHAR szBuf[MAX_PATH] = {0};
::GetEnvironmentVariable(_T( "USERPROFILE" ), szBuf, MAX_PATH);
...