Не могу проверить значение в реестре

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

#include <windows.h>
#include <stdio.h>

char veraddregkey(char*addregkey)
{
HKEY hKey;
char key;

char buf[255] = {1};
DWORD dwBufSize = sizeof(buf);
DWORD dwtype = 0;
char szBuf[MAX_PATH];
DWORD dwBufLen = MAX_PATH;

DWORD TYPE = REG_DWORD;
HKEY VAR = 0;
HKEY SECTION = HKEY_CURRENT_USER;
const char keyway[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";
const char keyname[] = "NoFind";

    // открываем ключ если он существует
    if(RegOpenKeyEx(SECTION, keyway, KEY_QUERY_VALUE, 1, &VAR) == ERROR_SUCCESS)
    {
        if(RegQueryValueEx(SECTION, keyname, &dwtype, &dwBufSize, (BYTE*) szBuf, &dwBufLen)== !ERROR_SUCCESS)
        {
            puts("Внимание: в реестре есть ключ но нет значения ключа ");
            system("pause");            
        }
        else
        {            
            puts("Внимание: в реестре есть значение и ключ ");
            system("pause");         
        }
    }
    else
    {
            puts("Внимание: в реестре нет ключа ");
            system("pause");
    }
}
int main(char*key)
{
    char keys;
    veraddregkey(&keys);

return 0;
}

Я английский не учил, во вторых не могу понять смысл функции RegQueryValueEx().

Я английский не учил

DWORD, подавляющее число документации написано на английском языке, так что придется изучать ;)

Демагогия (др.-греч. δημαγωγία «руководство народом; заискивание у народа») — набор ораторских и полемических приёмов и средств, позволяющих ввести аудиторию в заблуждение и склонить её на свою сторону. Чаще всего применяется для достижения политических целей, в рекламе и пропаганде. (Википедия).

Я не вижу здесь признаков демагогии.

По сути, Alf прав. В IT-сфере без английского — только картриджи в принтерах менять. И то под руководством старшего товарища.

По поводу RegQueryValueEx(). «Функция служит для получения типа и данных для открытого ключа реестра». «Обычно приложение сначала вызывает RegEnumValue для определения значений имён, а затем RegQueryValueEx для получения данных для этих имён.» (статья в MSDN)

Один из приемов демагогии — уход от прямого ответа, перевод разговора в другое русло.

Когда человек задает конкретный вопрос, он ждет на него конкретного ответа.

Когда ТС спрашивает, почему не работает его код по проверке ключа реестра, он надеется получить вразумительный ответ на свой вопрос.
А получает ответ рода «не работает, потому что ты дурак, кури маны и учи английский».

Это проблема практически всех русскоязычных форумов.
На том же StackOverflow большинство даже самых нубских вопросов получают конкретный ответ, а не вызывают размусоливание темы.

Во-первых, я дал прямой ответ: по приведённой мной ссылке есть пример кода, отвечающий на заданный вопрос.

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

В-третьих, касательно данного конкретного вопроса: в двух фразах не получится ответить на вопрос почему не работает код. Надо, как ты правильно подметил, «курить маны», поскольку там завязана работа нескольких системных функций и без изучения документации ничего не получится. Причём сами эти функции реализованы, мягко говоря, кривовато.

В-четвёртых, дураком ни кто ни кого не называл.

размусоливание темы.

А мне кажется, что «размусоливание» это зачастую даже приносит пользу. Ярким примером тому, являются ответы Черепа. Он не только даёт сухой ответ «пачему ентот код не работает так как я хачу?», но и даёт рекомендации по различным аспектам, которые так или иначе связаны с программированием( в данном случае, английский язык ), а это большой и жирный плюс( огромное спасибо ему за это ).
В данном случае товарищ DWORD, говорит об английском языке так, будто он ему не нужен и его нет смысла изучать, и, как правильно подметил Alf, это не есть хорошо. Не стыдно не знать, стыдно не учиться.

Хотя, selevit тоже прав. Наши форумы проигрывают буржуйским по прямоте и чёткости ответа. Часто «нубы» слышать в свой адрес только «дибил», «школоло», «криворукийджуниор» и другие русские ругательства( кстати, на этом форуме с этим достаточно туго, именно за это я люблю этот форум :3 ).
Это я вам как школьник с 1.5-летним «стажем» говорю :D

касательно данного конкретного вопроса: в двух фразах не получится ответить на вопрос почему не работает код.

Получится, я тебя уверяю.

Один из приемов демагогии — уход от прямого ответа, перевод разговора в другое русло.

selevit, это ты как то совсем не по делу. Я вот поковырялся с кодом DWORDа и со ссылками Черепа. Сам до этого с реестром никогда не колупался. Там действительно черт ногу сломит. Мне пришлось не только этот пример кода посмотреть но и по описаниям функций пройтись. Действительно в двух словах не объяснишь.

Но у меня вроде получилось исправить код.

#include <locale.h>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

char veraddregkey(char*addregkey)
{
HKEY hKey;
char key;

char buf[255] = {1};
DWORD dwBufSize = sizeof(buf);
DWORD dwtype = 0;
char szBuf[MAX_PATH];
DWORD dwBufLen = MAX_PATH;

DWORD TYPE = REG_DWORD;
HKEY the_key = 0;
HKEY SECTION = HKEY_CURRENT_USER;
const TCHAR keyway[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");
const TCHAR keyname[] = TEXT("NoFind");

    // открываем ключ если он существует
    if (RegOpenKeyEx(SECTION, keyway, 0, KEY_READ, &the_key) == ERROR_SUCCESS)
    {
        if (RegQueryValueEx(the_key, keyname, NULL, &dwtype, (BYTE*) szBuf, &dwBufLen) == ERROR_SUCCESS)
        {
            puts("Внимание: в реестре есть значение и ключ ");
            _tprintf(TEXT("%s\n"), szBuf);
            system("pause");            
        }
        else
        {            
            puts("Внимание: в реестре нет значения");
            system("pause");         
        }
    }
    else
    {
            puts("Внимание: в реестре нет ключа ");
            system("pause");
    }
    return '.';
}

int main(char*key)
{

    setlocale(0, "");

    char keys;
    veraddregkey(&keys);

return 0;
}

Программа вроде работает. Но только на уровне что бы посмотреть как работают функции.

Еще один момент. Я когда читал доку обратил внимание, что по терминам, есть key или subkey — это то, что в регедите обозначается папочкой, а есть value — это отображается в регедите в правой панели. У value т.е. «значения» есть имя и data — типа данные. Причем имя «значения» может тоже называться subkey.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.