Запрос прав администратора - PullRequest
3 голосов
/ 01 февраля 2010

У меня ошибка, если я не запускаю программу "Как администратор" Нарушение прав доступа ... в модуле ... и т. Д. *

Ошибка при попытке работы с моим INI-файлом. Как избежать ошибки или сделать запрос администратора прав.

(используя C ++ Builder6, но код Delphi для меня тоже читабелен)

по умолчанию работает с ini

TIniFile *FormCllient;
        FormCllient = new TIniFile(ExtractFilePath(Application->ExeName)+"Inf\\MyIniFile.ini");
...

Добавлено:

Я думаю, мне нужно добавить правила для папки после установки приложения Я делаю установочный пакет с Inno Setup ... Надеюсь, это реально.

***** Добавлено: *****

Как поместить мой файл в данные приложения?

Ответы [ 4 ]

3 голосов
/ 01 февраля 2010

Не помещайте INI-файл вместе с приложением /, если только вам не нужно /. Обычный пользователь, даже администратор / когда приложение явно не повышено / не имеет права писать в папку Program Files. Используйте переменную окружения% ProgramData%, если вы хотите написать ini-файл, доступный для всех пользователей, и используйте env var% USERPROFILE% \ AppData \ Roaming, если вы хотите записать данные, доступные только для текущего пользователя. Вы также можете использовать « SHGetFolderPath » для получения этих папок через API.

2 голосов
/ 03 февраля 2010

Вот функция, которую я написал, чтобы получить папку Application Data в C ++ Builder.

Если вы используете более старые версии C ++ Builder, возможно, вам придется изменить это, чтобы использовать AnsiStrings вместо Unicode (замените "UnicodeString" на "AnsiString" и измените вызов "SHGetSpecialFolderPathW" для чтения "SHGetSpecialFolderPath").

GetAppDataFolder.h:

#ifndef GetAppDataFolderH
#define GetAppDataFolderH

UnicodeString GetAppDataFolder(bool roaming = true);

#endif

GetAppDataFolder.cpp:

// Helper function to get the location of the current user's Application Data folder (used for
// storing per-user application settings).

#include <vcl.h>
#pragma hdrstop


/*  roaming:    True for application data that can be accessed by the same user on different
                machines. If you have per-user settings that are only relevant to a particular
                computer, e.g., screen resolution, set 'roaming' to false.
*/
UnicodeString GetAppDataFolder(bool roaming /* = true */)
{
    UnicodeString retVal;
    int csidl = roaming ? CSIDL_APPDATA : CSIDL_LOCAL_APPDATA;
    wchar_t thePath[MAX_PATH];
    if (SHGetSpecialFolderPathW(NULL, thePath, csidl, 0) == TRUE) {
        retVal = thePath;
    }
    return retVal;
}
0 голосов
/ 03 февраля 2010

Есть ли какие-либо причины для / против сохранения конфигурации вашего приложения в реестре? Я не предлагаю вам повторить код, который поднял вопрос, просто любопытно для моих собственных будущих проектов.

0 голосов
/ 01 февраля 2010

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

...