Russian Qt Forum
Апреля 27, 2025, 22:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSettings remove  (Прочитано 7423 раз)
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.071 секунд. Запросов: 23.