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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT Creator и работа с реестром через Windows-библиотеки  (Прочитано 7136 раз)
qwyllum
Гость
« : Декабрь 21, 2012, 08:59 »

Столкнулся с задачей написания программы, мониторящей ветку реестра на предмет изменений.

Написал простейшую консольную программу сперва без использования QT - все работает. Заменил в версии для QT printf на qDebug(). Компилируется без ошибок, но при попытке компиляции выдает ошибку, будто не может открыть реестр, хотя в консольной программе все работает. Выдает ошибку "Error in RegOpenKeyEx  998 "

Может кто знает, в чем может быть дело?

на всякий случай выкладываю код:
Код:
#include "dialog.h"
#include "ui_dialog.h"
#include <qt_windows.h>
#include <qDebug>



Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    DWORD  dwFilter = REG_NOTIFY_CHANGE_NAME |
                        REG_NOTIFY_CHANGE_ATTRIBUTES |
                        REG_NOTIFY_CHANGE_LAST_SET |
                        REG_NOTIFY_CHANGE_SECURITY;

      HANDLE hEvent;
      HKEY   hMainKey;
      HKEY   hKey;
      LONG   lErrorCode;


      hMainKey=HKEY_LOCAL_MACHINE;

      lErrorCode = RegOpenKeyEx(hMainKey, (LPCWSTR)"", 0, KEY_NOTIFY, &hKey);

             if (lErrorCode != ERROR_SUCCESS)
             {



                qDebug()<<"Error in RegOpenKeyEx "<< lErrorCode;
                return;
             }

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 21, 2012, 10:19 »

http://bit.ly/RI4B9c
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
porup
Гость
« Ответ #2 : Декабрь 21, 2012, 11:30 »

Или вот так:

Цитировать
Runtime error 988

Failure of a dll to register
The existence of a virus on your computer
Incorrect regional settings
The existence of an obsolete system file
Broken or missing registry files
Записан
Dancing_on_water
Гость
« Ответ #3 : Декабрь 21, 2012, 12:11 »

В main есть  вызов конструктора QCoreApplication или QApplication. Проверьте, что программа может добраться до всех необходимых библиотек.
Записан
qwyllum
Гость
« Ответ #4 : Декабрь 21, 2012, 12:40 »

Или вот так:

Цитировать
Runtime error 988

Failure of a dll to register
The existence of a virus on your computer
Incorrect regional settings
The existence of an obsolete system file
Broken or missing registry files

Спасибо, я умею пользоваться гуглом. Мне просто непонятно, какая ситуация может приводить к ошибке на QT и успешно работать в Visual Studio. Я засунул эти действия в обработчик кнопки и до обработки все успешно работает.

Может есть похожая библиотека на QT, которая бы позволяла отслеживать изменения реестра?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #5 : Декабрь 21, 2012, 12:47 »

Спасибо, я умею пользоваться гуглом. Мне просто непонятно, какая ситуация может приводить к ошибке на QT и успешно работать в Visual Studio. Я засунул эти действия в обработчик кнопки и до обработки все успешно работает.

Может есть похожая библиотека на QT, которая бы позволяла отслеживать изменения реестра?

Компиляция с поддержкой юникода/без поддержки.
А по делу - смотри исходники QSettings - он работает с реестром.
Записан
qwyllum
Гость
« Ответ #6 : Декабрь 21, 2012, 16:38 »

Спасибо, я умею пользоваться гуглом. Мне просто непонятно, какая ситуация может приводить к ошибке на QT и успешно работать в Visual Studio. Я засунул эти действия в обработчик кнопки и до обработки все успешно работает.

Может есть похожая библиотека на QT, которая бы позволяла отслеживать изменения реестра?

Компиляция с поддержкой юникода/без поддержки.
А по делу - смотри исходники QSettings - он работает с реестром.
По поводу поддержки юникода - сомнительно, т.к., если я правильно понимаю, проблемы с юникодом возникают прежде всего при использовании языков, отличных от английского. У меня нет нигде символов кирилицы, разве может быть проблема с анлийским текстом?

А как компилировать с поддержкой юникода? В гугле ничего толкового не нашел. Пробовал просто устанавливать режим, вроде

Код:
 QTextCodec codec = QTextCodec::codecForName("UTF-8");
 QTextCodec::setCodecForTr(codec);

По поводу QSetings - те примеры, которые я нашел позволяют только записать или считать текст. А мне нужно именно отслеживание обращений, даже просто при открытии ключа, без его сохранения.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #7 : Декабрь 21, 2012, 17:50 »


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

А как компилировать с поддержкой юникода? В гугле ничего толкового не нашел. Пробовал просто устанавливать режим, вроде

Код:
 QTextCodec codec = QTextCodec::codecForName("UTF-8");
 QTextCodec::setCodecForTr(codec);

По поводу QSetings - те примеры, которые я нашел позволяют только записать или считать текст. А мне нужно именно отслеживание обращений, даже просто при открытии ключа, без его сохранения.
по поводу юникода - http://msdn.microsoft.com/en-us/library/xxh1wfhz.aspx
А влияет он на то - какие функции будут вызываться и какие строки ожидать. Но может конечно проблема и не в этом.

По поводу QSettings - я не предлагал тебе использовать этот класс, я предлагаю тебе порыться в его исходниках, и посмотреть как внутри него организована работа с реестром.
Записан
Serr500
Гость
« Ответ #8 : Декабрь 21, 2012, 18:14 »

lErrorCode = RegOpenKeyEx(hMainKey, NULL, 0, KEY_NOTIFY, &hKey);
Записан
qwyllum
Гость
« Ответ #9 : Декабрь 21, 2012, 18:43 »

lErrorCode = RegOpenKeyEx(hMainKey, NULL, 0, KEY_NOTIFY, &hKey);

Спасибо огромное!!! Все заработало. Скажите, а если этот параметр будет ненулевым? Т.е. я захочу пойти по ветке дальше, в этом случае приемлем вариант типа (LPCWSTR)"path"?
Записан
Serr500
Гость
« Ответ #10 : Декабрь 21, 2012, 21:35 »

Скажите, а если этот параметр будет ненулевым? Т.е. я захочу пойти по ветке дальше, в этом случае приемлем вариант типа (LPCWSTR)"path"?
Этот вариант неприемлем. Дело в том, что строка имеет тип char* (байт на символ), а Вы её принудительно преобразуете в wchar_t* (два байта на символ). Ясно, что в результате получится не то, что надо. Я бы рекомендовал использовать одну из следующих форм записи, явно указывая на версию функции:
Код:
      lErrorCode = RegOpenKeyExA(hMainKey, "SOFTWARE", 0, KEY_NOTIFY, &hKey);
      lErrorCode = RegOpenKeyExW(hMainKey, L"SOFTWARE", 0, KEY_NOTIFY, &hKey);
Но можно и так:
Код:
      lErrorCode = RegOpenKeyEx(hMainKey, L"SOFTWARE", 0, KEY_NOTIFY, &hKey);
В последнем случае если макрос RegOpenKeyEx развернётся в ANSI-версию RegOpenKeyExA, Вы получите ошибку преобразования типа на стадии компиляции, а не ERROR_NOACCESS (== 998) во время выполнения.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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