Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qwyllum от Декабрь 21, 2012, 08:59



Название: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: 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;
             }



Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: Пантер от Декабрь 21, 2012, 10:19
http://bit.ly/RI4B9c


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: porup от Декабрь 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


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: Dancing_on_water от Декабрь 21, 2012, 12:11
В main есть  вызов конструктора QCoreApplication или QApplication. Проверьте, что программа может добраться до всех необходимых библиотек.


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: qwyllum от Декабрь 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, которая бы позволяла отслеживать изменения реестра?


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: alex312 от Декабрь 21, 2012, 12:47
Спасибо, я умею пользоваться гуглом. Мне просто непонятно, какая ситуация может приводить к ошибке на QT и успешно работать в Visual Studio. Я засунул эти действия в обработчик кнопки и до обработки все успешно работает.

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

Компиляция с поддержкой юникода/без поддержки.
А по делу - смотри исходники QSettings - он работает с реестром.


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: qwyllum от Декабрь 21, 2012, 16:38
Спасибо, я умею пользоваться гуглом. Мне просто непонятно, какая ситуация может приводить к ошибке на QT и успешно работать в Visual Studio. Я засунул эти действия в обработчик кнопки и до обработки все успешно работает.

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

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

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

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

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


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: alex312 от Декабрь 21, 2012, 17:50

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

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

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

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

По поводу QSettings - я не предлагал тебе использовать этот класс, я предлагаю тебе порыться в его исходниках, и посмотреть как внутри него организована работа с реестром.


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: Serr500 от Декабрь 21, 2012, 18:14
lErrorCode = RegOpenKeyEx(hMainKey, NULL, 0, KEY_NOTIFY, &hKey);


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: qwyllum от Декабрь 21, 2012, 18:43
lErrorCode = RegOpenKeyEx(hMainKey, NULL, 0, KEY_NOTIFY, &hKey);

Спасибо огромное!!! Все заработало. Скажите, а если этот параметр будет ненулевым? Т.е. я захочу пойти по ветке дальше, в этом случае приемлем вариант типа (LPCWSTR)"path"?


Название: Re: QT Creator и работа с реестром через Windows-библиотеки
Отправлено: Serr500 от Декабрь 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) во время выполнения.