2017-02-20 41 views
0

В настоящее время я пытаюсь удалить подраздел из раздела «Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Run». Проблема заключается в том, что, попробовав все возможные решения, мой код ошибки уникален, и единственный вопрос об этом не ответил: how to remove program from startup list using c++. Я использую Visual Studio для Windows x64 10, программа - это приложение Win32.VS C++ Удаление подраздела не работает! Код ошибки 0

создал ключ с:

BOOL registerForLocalStartup(PCWSTR regName, PCWSTR pathToExe, PCWSTR args) 
{ 
    HKEY hKey = NULL; 
    LONG lResult = 0; 
    BOOL fSuccess = TRUE; 
    DWORD dwSize; 

    const size_t count = MAX_PATH * 2; 
    wchar_t szValue[count] = {}; 


    wcscpy_s(szValue, count, L"\""); 
    wcscat_s(szValue, count, pathToExe); 
    wcscat_s(szValue, count, L"\" "); 

    if (args != NULL) 
    { 
     // caller should make sure "args" is quoted if any single argument has a space 
     // e.g. (L"-name \"Mark Voidale\""); 
     wcscat_s(szValue, count, args); 
    } 

    // For admin HKEY_LOCAL_MACHINE 
    lResult = RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, (KEY_WRITE | KEY_READ), NULL, &hKey, NULL); 

    fSuccess = (lResult == 0); 

    if (fSuccess) 
    { 
     dwSize = (wcslen(szValue) + 1) * 2; 
     lResult = RegSetValueExW(hKey, regName, 0, REG_SZ, (BYTE*)szValue, dwSize); 
     fSuccess = (lResult == 0); 
    } 

    if (hKey != NULL) 
    { 
     RegCloseKey(hKey); 
     hKey = NULL; 
    } 

    return fSuccess; 
} 

Вот мой код:

bool DeleteValueKey(HKEY hKeyRoot, std::wstring Subkey, std::wstring ValueKey) 
{ 
    HKEY hKey = NULL; 
    bool bReturn = false; 

    long result = RegOpenKeyEx(hKeyRoot, Subkey.c_str(), 0, KEY_READ | KEY_WRITE | KEY_WOW64_32KEY, &hKey); 

    wcout << "Result of RegOpenKeyEx: " << result << endl; 

    if (result == ERROR_SUCCESS) 
    { 
     long result2 = RegDeleteKeyEx(hKey, ValueKey.c_str(), KEY_WOW64_32KEY, 0); 
     wcout << "Result of RegDeleteKeyEx: " << result2 << endl; 
     if (result2 == ERROR_SUCCESS) 
     { 
      bReturn = true; 
     } 
    } 

    if (hKey != NULL) { RegCloseKey(hKey); } 

    return bReturn; 
} 

И это то, что я пытался позвонить:

bool result = DeleteValueKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", L"test1"); 

      if (result) 
      { 
       wcout << "SUCCESS" << endl; 
      } 
      else 
      { 
       wcout << "FAILURE: "<< GetLastError() << endl; 
      }*/ 

ВЫВОД:

Result of RegOpenKeyEx: 0 
Result of RegDeleteKeyEx: 2 
FAILURE: 0 

У кого-то есть идея? Я схожу с ума не неоспоримым состоянии исправить такую ​​вопиющую проблему ...

+0

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

+0

Является ли ваша программа 32-разрядной или 64-разрядной? Является ли ваша Windows 32-разрядной или 64-разрядной? Какой код ошибки вы получаете? Что возвращает ':: GetLastError()'? –

+0

Я использую Windows x64, а мое приложение - x32. Код ошибки, который я получаю, равен 0. – Qubasa

ответ

1

Чтобы удалить значение в Run ключ вы должны использовать RegDeleteKeyValue (или RegDeleteValue, если вы поддерживаете WinXP и старше).

RegDeleteKeyEx Используется для удаления всего ключа (и всех его значений), и вы не хотите этого делать, потому что у вас нет ключа Run.

См. this blog post для терминологии, используемой для описания различных частей реестра.