Russian Qt Forum

Qt => Общие вопросы => Тема начата: stima от Ноябрь 21, 2011, 13:55



Название: QSettings remove
Отправлено: 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


Название: Re: QSettings remove
Отправлено: madRoger от Ноябрь 21, 2011, 14:16
Цитировать
ключ: C:\Windows\Microsoft.NET\Framework\v1.0.3705\iehost.dll

Это вероятно не имя а значение. Удалять надо ключ по имени.


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 21, 2011, 15:00
Это ключ, я его получаю с помощью allKeys()


Название: Re: QSettings remove
Отправлено: marbius от Ноябрь 21, 2011, 15:06
Если у Вас Vista/win7, то попробуйте запустить Вашу программу с правами администратора
(или для проверки работоспособности Вашей программы попробуйте задать другую ветку, отличную от CurrentVersion)
и не забудьте про экранирование обратных слэшей \ должно быть записано как \\


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 21, 2011, 18:57
Прикол в том, что даже метод contains возвращает false.

Еще раз я получаю ключ методом allKeys() потом просто проверяю есть ли он settings.contains(key) и получаю false


Название: Re: QSettings remove
Отправлено: madRoger от Ноябрь 21, 2011, 21:02
Выложи весь код, и какая ОС.


Название: Re: QSettings remove
Отправлено: PavelVX от Ноябрь 22, 2011, 09:38
QSettings settings(path, QSettings::NativeFormat);
settings.value(key); //что тут выдает??
вполне допускаю, что
1. путь кривой
2. не хатает прав доступа
Вчера подобное делал(проверял, есть ли нужный ключ, если значение меня не устраивало, то удалял ключ), все работало нормально (ХР, права админа)


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 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("");
    }
}


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


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 22, 2011, 15:20
Да win7, но uac откючен (покрайне мере находиться в нижнем положении). Как вообще это все "подавить" и дать программе права полного администратора.


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 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

и епт я никак непойму почему.


Название: Re: QSettings remove
Отправлено: zenden от Ноябрь 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 битных программ?


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 22, 2011, 22:35
все это я читал, но понял что нужно учить английский.


Название: Re: QSettings remove
Отправлено: stima от Ноябрь 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 файле что-то указывать нужно?