Удаление ключа из реестра

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

char delkey(char *acm)
{
    HKEY hKey;
    DWORD dwDisp;

    #define APP_INIT L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"

    if(RegCreateKeyExW(HKEY_CURRENT_USER,APP_INIT,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwDisp) != ERROR_SUCCESS)
    {
        return 0;
    }

    if(RegSetValueExW( hKey, L"programma", 0, REG_SZ, NULL, 0) != ERROR_SUCCESS ) 
     {
        return 0;
     }

    RegCloseKey(hKey);
}

Код компилируется с ошибками, или просто некорректно работает? Если с ошибками, то сюда лог вставьте.

Если проблема в работе программы — опишите, что именно не работает.

К сожалению, сейчас нет возможности проверить код WinAPI.

Код работает нормально,просто я не знаю как использовать функцию.захожу в гугл вижу там человек с аналогичной проблемой мучается а его в гугл посылают.рекурсия какая тополучается, справочник тоже не хочу листать потому что мне ясно что RegDeleteKey — функция удаления ключа и т.д.

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

Я не могу найти конкретного примера функции RegDeleteKey. Чем короче он будет тем лучше. Я знаю что можно решить эту задачу в пару строчек, к примеру мне нужна тривиальная программа которая бы добавляла ключ при вводе 1 кейса и удаляла ключ при вводе 2 кейса, все.

Без лишних слов и демогогий мол а как а что да что за программа, да надо в гугл зайти да там поищи да по ссылке прочитай и т/д, это все не важно.

Я конкретно спрашиваю селевит, программу можешь такую написать? Напишешь, спасибо большое, не напишешь тоже спасибо. Просто времени мало на болтовню и поиски ибо итак уже много времени потерял и много трепа услышал причем бесполезного. Ладно вот код поправь если сможешь конечно. Вот код.

#include <windows.h>
#include <iostream>

using namespace std;

char ne_vazhno(char*fky)
{
    HKEY hk;
    char sysbuf[33];
    RegCreateKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
    RegSetValueEx(hk,"MyProgramm",0,REG_SZ,(LPBYTE)sysbuf, strlen(sysbuf) + 1);
    RegCloseKey(hk);
}

char bez_voprosov(char*fky)
{

    HKEY hk;
    RegCreateKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
    RegDeleteKey(hk,"MyProgramm");
    RegCloseKey(hk);
}

int main()
{
    int noy_love_open_code;
    char ladno;

    cout << "current: ";
    cin  >> noy_love_open_code;

    switch(noy_love_open_code)
    {
        case 1:
            {
                cout << "Okay " << endl;
                ne_vazhno(&ladno);
                break;
            }
        case 2:
            {
                cout << "Nou " << endl;
                bez_voprosov(&ladno);
                break;
            }
        default:
            main();
            break;
    }

    return 0;
}

Мне нужно чтобы программа myprogramm.exe добавлялась в автозагрузку при 1 кейсе и удалялась из автозагрузки при 2 кейсе.

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

Селевит, помоги пожалуйста реально уже устал искать пример

На сайте у мелкомягких есть пример удаления ключа из реестра. Как я понял, чтобы удалить ключ, содержащий вложенные ключи — нужно рекурсивно пройтись по всем подключам и их также потереть.

Перевел комментарии из примера MSDN на родной, чтоб было понятнее. Ниже удаление ключа из реестра происходит внутри main() — строка RegDelnode(HKEY_CURRENT_USER, TEXT("Software\\TestDir"));.

Попробуй заюзать эту функцию и напиши, что получилось. Проверить код нет возможности, т. к. виртуалка с виндой не запускается.

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

//*************************************************************
//
//  RegDelnodeRecurse()
//
//  Назначение: Удаляет ключ из реестра вместе с вложенными ключами / значениями.
//
//  Аргументы: hKeyRoot - Корневой ключ
//             lpSubKey - Ключ для удаления
//
//  Возвращает: TRUE в случае успеха.
//              FALSE в случае ошибки.
//
//*************************************************************

BOOL RegDelnodeRecurse (HKEY hKeyRoot, LPTSTR lpSubKey)
{
    LPTSTR lpEnd;
    LONG lResult;
    DWORD dwSize;
    TCHAR szName[MAX_PATH];
    HKEY hKey;
    FILETIME ftWrite;

    // Первым делом проверим, можем ли мы удалить ключ,
    // без рекурсии (т. е. удаления вложенных ключей или значений)

    lResult = RegDeleteKey(hKeyRoot, lpSubKey);

    if (lResult == ERROR_SUCCESS) 
        return TRUE;

    lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);

    if (lResult != ERROR_SUCCESS) 
    {
        if (lResult == ERROR_FILE_NOT_FOUND) {
            printf("Key not found.\n");
            return TRUE;
        } 
        else {
            printf("Error opening key.\n");
            return FALSE;
        }
    }

    // Проверка на завершающий слеш, и его добавление, при необходимости.

    lpEnd = lpSubKey + lstrlen(lpSubKey);

    if (*(lpEnd - 1) != TEXT('\\')) 
    {
        *lpEnd =  TEXT('\\');
        lpEnd++;
        *lpEnd =  TEXT('\0');
    }

    // Перечисление ключей

    dwSize = MAX_PATH;
    lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                           NULL, NULL, &ftWrite);

    if (lResult == ERROR_SUCCESS) 
    {
        do {

            StringCchCopy (lpEnd, MAX_PATH*2, szName);

            if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
                break;
            }

            dwSize = MAX_PATH;

            lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL,
                                   NULL, NULL, &ftWrite);

        } while (lResult == ERROR_SUCCESS);
    }

    lpEnd--;
    *lpEnd = TEXT('\0');

    RegCloseKey (hKey);

    // Еще раз пробуем удалить ключ

    lResult = RegDeleteKey(hKeyRoot, lpSubKey);

    if (lResult == ERROR_SUCCESS) 
        return TRUE;

    return FALSE;
}

//*************************************************************
//
//  RegDelnode()
//
//  Назначение: Удаляет ключ из реестра и все его вложенные ключи / значения.
//
//  Параметры: hKeyRoot - Корневой ключ
//             lpSubKey - Ключ для удаления
//
//  Возвращает: TRUE в случае успеха.
//              FALSE при возникновении ошибки.
//
//*************************************************************

BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey)
{
    TCHAR szDelKey[MAX_PATH*2];

    StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
    return RegDelnodeRecurse(hKeyRoot, szDelKey);

}

void __cdecl main()
{
   BOOL bSuccess;

   bSuccess = RegDelnode(HKEY_CURRENT_USER, TEXT("Software\\TestDir"));

   if(bSuccess)
      printf("Success!\n");
   else printf("Failure.\n");
}

Тут совершенно не нужна рекурсия, надо элементарно поправить две строчки. Чтобы я мог взять и вставить это в готовую функцию.

RegCreateKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run", &k);
RegDeletekey(k,"MyProgramm",0,REG_SZ,(LPBYTE)sysbuf, strlen(sysbuf) + 1);
RegCloseKey(k);

и обратился я изначально больше к тебе,чем к этим пацанам которые только 1книгу прочитали уже себя программистами называют.к тебе обратился потому что ты грамотный человек и знаешь ответы на все вопросы,поправь пару строчек чтобы была рабочая функция удаления ключа. К примеру есть программа с ключем MyProg и значением MyProg.exe так вот надо удалить ключ этой программы вместе с его значением, не надо копировать код с публичного сайта,надо элементарно поправить пару строчек в функции RegDeleteKey и аргументировать код по возможности,чтобы я глядя на пример уже отталкивался и делал выводы для себя

RegDelnode нет такой функции.

Функция Назначение

RegCloseKey Закрывает открытый ключ системного реестра
RegConnectRegistry Выполняет соединение с предопределенным дескриптором системного реестра на другом компьютере
RegCreateKeyEx Создает новый подключ
RegDeleteKey Удаляет ключ из системного реестра
RegDeleteValue Удаляет значение из системного реестра
RegDisablePredefinedCashe Отключает таблицу предопределенных дескрипторов системного реестра в ключе HKCU для текущего процесса
RegEnumKeyEx Перечисляет все подключи данного ключа
RegEnumValue Перечисляет все значения данного ключа
RegFlushKey Сразу же записывает все изменения, произведенные в системном реестре
RegLoadKey Загружает раздел в корневой ключ, находящийся на вершине иерархии
RegNotifyChangeKeyValue Указывает на момент изменения ключа или значения в системном реестре
RegOpenCurrentUser Открывает ключ HKCU для пользователя текущей потока
RegOpenKeyEx Открывает существующий ключ системного реестра с расширением Win32
RegOverridePredefKey Переопределяет переопределенный ключ системного реестра в соответствии с указанным ключом системного реестра
RegQueryInfoKey Возвращает информацию о ключе
RegQueryMultipleValues Выбирает тип и данные для списка имен значений
RegQueryValueEx Возвращает значение (с расширенными типами данных Win32)
RegReplaceKey Заменяет ключ содержимым файла при перезапуске системы
RegRestoreKey Считывает содержимое раздела ранее сохраненный ключ
RegSaveKey Сохраняет значения и подключи данного ключа в файле улья
RegSetValueEx Присваивает ключу значение (с новыми типами данных)
RegUnLoadKey Удаляет раздел из системного реестра

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

С таким подходом — на free-lance.ru. Ты хочешь решить проблему, не разбираясь в сути вопроса.

Я твою проблему решить не могу, почему — писал выше. Разбирайся в примерах, используя мозги, или жди от участников форума готового решения. Думаю, что помощники найдутся.

RegDelnode нет такой функции.

Она есть и имплементирована в примере выше. Будь внимательнее.

BOOL RegDelnode (HKEY hKeyRoot, LPTSTR lpSubKey)
{
    TCHAR szDelKey[MAX_PATH*2];

    StringCchCopy (szDelKey, MAX_PATH*2, lpSubKey);
    return RegDelnodeRecurse(hKeyRoot, szDelKey);
}

Селевит, вопрос.ты самоучка в c++?

Да.

Селевит, Серега тебя звать вроде. Да, Серега. Знаешь зачем я пришел к тебе на сайт? Потому что ты хороший человек и всегда всем помогаешь. К тебе обращались и обращаются люди с разными проблемами и ты как бог всегда всем помогал и помогаешь, поверь мне на слово, я уже с этой проблемой мучаюсь не первый день, и я сам додумался и написал программу читая мануал справочника по винапи, читал уроки C++ но мне непонятна непосредственна функция RegDelKey, не хватает толчка, просто поправить надо элементарно и все. Ты мне объясни нельзя ли короче привести код? Функция RegDelKey какие аргументы может принимать и сколько для того чтобы удалить ключ. Скажи пожалуйста, мне конечно понятно но как-то смутно понятно.

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

Короче,пока сам не додумаешься и не сделаешь как надо.хрен кто руку помощи протянет, те кто действительно разбирается не лазиют по сайтам а занимаются работой и ограничиваются узким кругом провереных сайтов а новички задают много вопросов и именно из новичков получаются в итоге прошареные хакеры озлобленые и жестокие на весь мир, потому что информацию которую они доставали, они доставали по крупицам, им никто не подсказывал и она доставалась им с ну очень большим трудом, большенство программистов больше выпендриваются что они программисты и корчат из себя богов думая что что они много знают, а как просишь подсказать, так начинается. Мол нуб, да ты лох и ничтожество итд. Надо уламывать как целку и хвалить только чтобы подсказали. Я считаю так, кто может и кто хочет подсказать. Тот берет и подсказывает, кто ничего не может но хочет выебнуться, тот будет себя хвалить а на деле нет результата. Ребята обращаюсь к вам, подскажите какие нибудь ресурсы где могут подсказать словом и делом?

Мне обидно что у каких то тп и ламеров интернет скоросной они играют во всякие доты задроты и игры,а тут занимаешься вещами и языки программирования знаешь.а скорости инета не хватает даже на открытие веб страницы, 5кб/с скорость, и с этой скоростью чтото гуглить ну это извращенство и нервы надо железные иметь.у кого такая скорость примите мои соболезнования,тот меня понимает.и вот когда начинаешь просить о помощи,нормально просить а тебе в ответ смотрят на тебя как на ебанутого и говорят тут ——-> gooogle заходишь в поисковик и наичнаешь искать или начинают умничать и расспрашивать.в такие моменты так и хочется сказать твой рот ебал сука!я всегда стараюсь помогать нормальным пацанам,чтобы не сказали в спину пидрас а сказали человек помог.я реально уже сколько ночей не сплю,мучаюсь и сам все делаю!

«Дрочишь, пьешь и не женат? Это Путин виноват...»

LOL. В сети куча инфы по винапи, оф. документация от МС. Переставай здесь клоунаду устраивать.

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

Ответить

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

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

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

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

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

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