Russian Qt Forum
Ноябрь 26, 2024, 07:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSettings remove  (Прочитано 7248 раз)
stima
Гость
« : Ноябрь 21, 2011, 13:55 »

Есть путь: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs
и ключ: C:\Windows\Microsoft.NET\Framework\v1.0.3705\iehost.dll

Как я могу удалить этот ключ?

Я пробывал:

Код:
QSettings settings(path, QSettings::NativeFormat);
settings.remove(key);

Но это не работает.

Он даже его не видит:
Код:
settings.contains(key);

возвращает false
Записан
madRoger
Гость
« Ответ #1 : Ноябрь 21, 2011, 14:16 »

Цитировать
ключ: C:\Windows\Microsoft.NET\Framework\v1.0.3705\iehost.dll

Это вероятно не имя а значение. Удалять надо ключ по имени.
Записан
stima
Гость
« Ответ #2 : Ноябрь 21, 2011, 15:00 »

Это ключ, я его получаю с помощью allKeys()
Записан
marbius
Гость
« Ответ #3 : Ноябрь 21, 2011, 15:06 »

Если у Вас Vista/win7, то попробуйте запустить Вашу программу с правами администратора
(или для проверки работоспособности Вашей программы попробуйте задать другую ветку, отличную от CurrentVersion)
и не забудьте про экранирование обратных слэшей \ должно быть записано как \\
« Последнее редактирование: Ноябрь 21, 2011, 15:09 от µarbius » Записан
stima
Гость
« Ответ #4 : Ноябрь 21, 2011, 18:57 »

Прикол в том, что даже метод contains возвращает false.

Еще раз я получаю ключ методом allKeys() потом просто проверяю есть ли он settings.contains(key) и получаю false
Записан
madRoger
Гость
« Ответ #5 : Ноябрь 21, 2011, 21:02 »

Выложи весь код, и какая ОС.
Записан
PavelVX
Гость
« Ответ #6 : Ноябрь 22, 2011, 09:38 »

QSettings settings(path, QSettings::NativeFormat);
settings.value(key); //что тут выдает??
вполне допускаю, что
1. путь кривой
2. не хатает прав доступа
Вчера подобное делал(проверял, есть ли нужный ключ, если значение меня не устраивало, то удалял ключ), все работало нормально (ХР, права админа)
Записан
stima
Гость
« Ответ #7 : Ноябрь 22, 2011, 14:37 »

Код:
void clean(QString path, QString key)
{
    QSettings settings(path, QSettings::NativeFormat);
    QStringList keys = settings.childKeys();

    if ( keys.contains(key) ) { // тут все верно полученный ключ находится в keys
        qDebug() << "its key";  // эта строка печатается
        settings.remove(key); // но не удадяет
        qDebug() << settings.contains(key); //возвращает false
        qDebug() << settings.value(key); // возвращает пустой QVariant(,)
    } else {
        qDebug() << "its group";
        settings.remove("");
    }
}
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Ноябрь 22, 2011, 15:00 »

Код:
        settings.remove(key); // но не удадяет
        qDebug() << settings.contains(key); //возвращает false
Windows 7? UAC включен? Тогда вы редактируете не реестр, а его копию в VirtualStore.
Записан
stima
Гость
« Ответ #9 : Ноябрь 22, 2011, 15:20 »

Да win7, но uac откючен (покрайне мере находиться в нижнем положении). Как вообще это все "подавить" и дать программе права полного администратора.
Записан
stima
Гость
« Ответ #10 : Ноябрь 22, 2011, 20:04 »

Хм написал через winapi:
...
RegOpenKeyEx(lRegPath, lPath, 0, KEY_ALL_ACCESS, &hKey) // тут ERROR_SUCCESS
...
RegDeleteKeyEx(hKey, lKey, KEY_WOW64_32KEY, 0); // тут ERROR_FILE_NOT_FOUND

и епт я никак непойму почему.
Записан
zenden
Гость
« Ответ #11 : Ноябрь 22, 2011, 20:55 »

Чтобы писать в области реестра, недоступные простому юзеру, есть несколько способов:

1. Запустить копию приложения с повышенными правами, примерно так:

Код
C++ (Qt)
void RunElevated()
{
       SHELLEXECUTEINFO TempInfo = {0};
       TCHAR buf[MAX_PATH];
       GetModuleFileName(0, buf, MAX_PATH - 1);
       CString s = GetAppFolder();
       TempInfo.cbSize = sizeof(SHELLEXECUTEINFOA);
       TempInfo.fMask = 0;
       TempInfo.hwnd = NULL;
       TempInfo.lpVerb = _T("runas");
       TempInfo.lpFile = buf;
       TempInfo.lpParameters = _T(" /option");
       TempInfo.lpDirectory = s;
       TempInfo.nShow = SW_NORMAL;
 
       ::ShellExecuteEx(&TempInfo);
}
 
Запущенная копия уже будет обладать нужными правами.

2. Задать нужные права в манифесте приложения
Цитата: xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="UacDemo" type="win32"/>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator"/>
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly>

кстати говоря, добавление манифеста избавит вас от проблемы VirtualStore, о которой уже было сказано выше.

Код:
RegDeleteKeyEx(hKey, lKey, KEY_WOW64_32KEY, 0); // тут ERROR_FILE_NOT_FOUND

зачем вы используете параметр KEY_WOW64_32KEY ? У вас стоит проблема взаимодействия 64 битных и 32 битных программ?
« Последнее редактирование: Ноябрь 22, 2011, 20:59 от zenden » Записан
stima
Гость
« Ответ #12 : Ноябрь 22, 2011, 22:35 »

все это я читал, но понял что нужно учить английский.
« Последнее редактирование: Ноябрь 22, 2011, 22:47 от stima » Записан
stima
Гость
« Ответ #13 : Ноябрь 23, 2011, 12:06 »

Хм а как правильно добавить этот манифест. Сейчас я правлю манифест созданный автоматически, но некакого эффекта нет. Собственно манифест:
Код:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

В .pro файле что-то указывать нужно?
« Последнее редактирование: Ноябрь 23, 2011, 12:09 от stima » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 22.