Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161

Автозагрузка WinAPI

13.08.2015, 23:08. Показов 3492. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Продолжая тему, начатую в Списке процессов и пользователей, написал 2 функции: проверки наличия программы в автозагрузке в Run, а также добавления/удаления в реестр записи об автозагрузке в эту ветку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "stdafx.h"
#include <windows.h>
//#include <tlhelp32.h>
#include <iostream>
using namespace std;
 
BOOL IsBoot()
{
    HKEY key;
    if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_WRITE,&key)) == ERROR_SUCCESS)
    {
        if((RegGetValue(key, NULL, L"processExplorer",RRF_RT_REG_SZ, NULL, NULL, NULL)) == ERROR_SUCCESS) return TRUE;
        else return FALSE;
    }
    else cout << "A problem with RegOpenKeyEx() in IsBoot" << endl;
}
 
 
void DoUndoBoot(BOOL isBoot)
{
    HKEY key;
 
    if (isBoot == FALSE)
    {
        cout << "Would you like to add this application on boot? Y - to add. ";
        char* choiceFirstStep = new char;
        char choiceNextStep = 0;
        cin >> *choiceFirstStep;
        choiceNextStep = *choiceFirstStep;
        if (choiceNextStep == 'Y' || choiceNextStep == 'y')
        {
            if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_WRITE,&key)) == ERROR_SUCCESS)
            {
                TCHAR path[MAX_PATH];
                GetModuleFileName(NULL,path,MAX_PATH);
                if ((RegSetValueEx(key,L"processExplorer",0,REG_SZ ,(LPBYTE) path, (wcslen(path) + 1) * sizeof (wchar_t))) != ERROR_SUCCESS)
                    cout << "A problem with RegSetValueEx()" << endl;
                RegCloseKey(key);
            }
            else cout << "A problem with RegOpenKeyEx() in DoUndoBoot" << endl;
        }
    }
    else
    {
        cout << "Would you like to remove this application from boot? Y - to remove. ";
        char* choiceFirstStep = new char;
        char choiceNextStep = 0;
        cin >> *choiceFirstStep;
        choiceNextStep = *choiceFirstStep;
        if (choiceNextStep == 'Y' || choiceNextStep == 'y')
        {
            if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_WRITE,&key)) == ERROR_SUCCESS)
            {
                RegDeleteValue(key,L"processExplorer");
                RegCloseKey(key);
            }
            else cout << "A problem with RegOpenKeyEx() in DoUndoBoot" << endl;
        }
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    BOOL isBoot = IsBoot();
    DoUndoBoot(isBoot);
// Для примера пусть будет просто Hello, World!
    cout << "Hello, World!" << endl;
    system("pause");
    return 0;
}
Ошибок вроде как нет, но добавлять в автозагрузку упорно не желает. В чём косяк?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2015, 23:08
Ответы с готовыми решениями:

Автозагрузка (C++, WINAPI)
У меня есть код для автозагрузки программы, но при включения пк ничего не происходит. То ли в коде проблема, то ли я совсем не то делаю....

Автозагрузка
Народ подскажите пожалуйста как прописать программу в автозагрузку? Пробовал,так: #include &lt;iostream&gt; #include...

Автозагрузка
Как мне добавить свою прогу в автозагрузку? Я знаю один код, только не знаю куда его писать, подскажите... HKEY hKey; char...

22
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 10:54
Цитата Сообщение от rusack007 Посмотреть сообщение
добавлять в автозагрузку упорно не желает
И снова "терминология блондинок".
Что значит "не желает" ? Так прям и пишет "все, не буду" ?..
2
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
14.08.2015, 11:20
rusack007, запускаете с правами админа? Код не запускал, но по идее для добавления записей в HKLM нужны права.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 12:21  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
"терминология блондинок"
Ок: при проверке данной ветки реестра, а также при перезагрузке (на всякий случай) загружаться автозагрузка не происходит.

Цитата Сообщение от schdub Посмотреть сообщение
запускаете с правами админа?
Да, в настройках манифеста прописано requireAdministrator, и при каждом запуске запрос удовлетворяется.
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
14.08.2015, 12:33
Цитата Сообщение от rusack007 Посмотреть сообщение
Ок: при проверке данной ветки реестра, а также при перезагрузке (на всякий случай) загружаться автозагрузка не происходит.
от тебя человек хотел услышать , что показывает GetLastError
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 13:08  [ТС]
Цитата Сообщение от rusack007 Посмотреть сообщение
Ошибок вроде как нет
Цитата Сообщение от Игорь с++ Посмотреть сообщение
что показывает GetLastError
Нули. После всех функций работы с реестром проверил: GetLastError возвращает нули.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 13:25
А командную строку запуска в кавычки заключать не пробовал ?
Т.е. например так:
"C:\My Program\file.exe" arg-1 arg-2 "arg with spaces 3"
?
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 13:34  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
А командную строку запуска в кавычки заключать не пробовал ?
Попробовал, без результата.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 13:40
Почему в коде этого нет ?
Командная строка, если она содержит пробелы, должна быть в кавычках.

И скриншот ключа "Run" реестра - в студию, пожалуйста.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
14.08.2015, 16:12
Лучший ответ Сообщение было отмечено rusack007 как решение

Решение

rusack007, много ошибок в функции IsBoot. Ее можно вот так, например, реализовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
BOOL IsBoot() {
    HKEY key;
    BOOL ret = FALSE;
    DWORD dwTemp;
    TCHAR path[MAX_PATH] = {0};
    static TCHAR regPath[] = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
    if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath,0,KEY_READ,&key)) != ERROR_SUCCESS) {
        std::cout << "RegOpenKeyEx() failed " << GetLastError() << std::endl;
    } else {
        dwTemp = sizeof(path);
        if ((RegGetValue(key, NULL, L"processExplorer", RRF_RT_REG_SZ, 0, path, &dwTemp)) != ERROR_SUCCESS) {
            std::cout << "RegGetValue failed " << GetLastError() << std::endl; 
        } else {
            ret = TRUE;
        }
        RegCloseKey(key);
    }
    return ret;
}
С этой реализацией у меня ваш код работает. Глядел только на код внутри функции IsBoot(), так что скорее всего у вас еще есть ошибки.
1
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 18:35  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Почему в коде этого нет ?
Командная строка, если она содержит пробелы, должна быть в кавычках.
Так, я, видимо, неправильно понял.
Цитата Сообщение от Убежденный Посмотреть сообщение
командную строку запуска в кавычки заключать не пробовал
Что именно требуется? Я так задним числом прикинул и просто запустил приложение из cmd .


C++
1
RegGetValue(key, NULL, L"processExplorer", RRF_RT_REG_SZ, 0, path, &dwTemp
Так, а почему нельзя просто NULL вместо path и dwTemp? Меня же интересует лишь наличие строчки, а не её содержимое.

Интересно получается: при первом запуске IsBoot отрабатывает и возвращает FALSE => DoUndoBoot предлагает добавить в автозагрузку. Добавил. Запустил приложение снова, IsBoot возвращает TRUE => DoUndoBoot предлагает из автозагрузки убрать. Но это значит, что в автозагрузке строчка-то была, то есть DoUndoBoot якобы отработал верно. Но в реестре вообще мёртвая тишина.
Миниатюры
Автозагрузка WinAPI  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 18:39
Цитата Сообщение от rusack007 Посмотреть сообщение
Что именно требуется? Я так задним числом прикинул и просто запустил приложение из cmd
Значения из ключа "Run" обрабатываются проводником как обычная командная строка.
Поэтому если вы запишете туда следующее:
C:\My Program\file.exe arg1 arg2
то проводник будет считать это командой на запуск файла C:\My с
аргументами Program\file.exe, arg1 и arg2.
А правильно (и это универсальный способ) заключать логически неделимые
элементы командной строки в кавычки, даже если там нет пробелов:
"C:\My Program\file.exe" "arg1" "arg2"

Цитата Сообщение от rusack007 Посмотреть сообщение
Но это значит, что в автозагрузке строчка-то была, то есть DoUndoBoot якобы отработал верно. Но в реестре вообще мёртвая тишина.
Ищите пропажу здесь: HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
1
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 20:39  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
HKLM\Software\Wow6432Node\Microsoft\Wind ows\CurrentVersion\Run
Ага, нашлась.
Миниатюры
Автозагрузка WinAPI  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 20:41
Ну лично мне из этого скрина сразу понятно, почему командная строка не работает.
И здесь сразу две причины, одна на поверхности, вторая чуть глубже.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 20:49  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
почему командная строка не работает
Пробел имеется в названии.

Однако, решил проверить догадку о корректности работы DoUndoBoot. Запустил, добавил, перезагрузился - работает! Сейчас проверю RegDeleteValue.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 20:54
Проблема #2: папка с программой "C:\Users\Asus" будет доступна
не всем пользователям. Т.е., залогинившись, например, пользователем
Gigabyte [], автозагрузка не сработает.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 21:03  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
будет доступна не всем пользователям
Справедливо

Так, а ветка реестра другая из-за 64-битной системы?

И ещё:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
else
    {
        cout << "Would you like to remove this application from boot? Y - to remove. ";
        char* choiceFirstStep = new char;
        char choiceNextStep = 0;
        cin >> *choiceFirstStep;
        choiceNextStep = *choiceFirstStep;
        if (choiceNextStep == 'Y' || choiceNextStep == 'y')
        {
            if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_WRITE,&key)) == ERROR_SUCCESS)
            {
                if(RegDeleteValue(key,L"processExplorer") != ERROR_SUCCESS)
                    cout << "A problem with RegDeleteValue()" << endl;
                RegCloseKey(key);
            }
            else cout << "A problem with RegOpenKeyEx() in DoUndoBoot " << GetLastError() << endl;
        }
Собственно, A problem with RegOpenKeyEx() in DoUndoBoot. Но GetLastError() возвращает нуль.
Адрес менял на \Software\Wow6432Node\Microsoft\Windows\ CurrentVersion\Run, но это не суть ошибки, ведь и та и другая ветки существуют.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.08.2015, 21:17
Цитата Сообщение от rusack007 Посмотреть сообщение
Так, а ветка реестра другая из-за 64-битной системы?
Из-за того, что в реестр пишет 32-битное приложение на 64-битной системе (WOW64).
Механизм называется "Registry Redirector" (описание есть в MSDN).
Отключается флагом KEY_WOW64_64KEY, например, при открытии ключа.
1
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
14.08.2015, 22:09  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Отключается флагом
Да это некритично, буду знать. С RegOpenKeyEx() в удалении автозагрузки надо разобраться в первую очередь.
0
 Аватар для rusack007
22 / 22 / 9
Регистрация: 30.07.2015
Сообщений: 161
15.08.2015, 22:38  [ТС]
Цитата Сообщение от rusack007 Посмотреть сообщение
С RegOpenKeyEx() в удалении автозагрузки надо разобраться в первую очередь
А ларчик просто открывался, ребята.
У меня было 2 проекта запущено, один из которых в манифесте имел requireAdministrator, а я, не подумав, перекидывал функции из одного в другой и обратно, запуская, создавая всевозможные комбинации рабочих/нерабочих exe-шников. А когда в проект с манифестом с requireAdministrator положил обе функции, собрал, запустил, проследил изменения в regedit, а затем перезагрузил, то всё заработало.



P.S. Одно только смущает слегка, порой при запуске выводит cout об ошибке, которой нет (потому что в той же строчке GetLastError = 0). На работу не влияет, но как-то странно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2015, 22:38
Помогаю со студенческими работами здесь

автозагрузка ч/з регистр
есть функция записи в регистр на автозагрузку. Решение строит, запускает, все работает, кроме нее. Просто не записывает и все. можете...

Автозагрузка и моя программа
Как в C++ добавить программу в автозагрзку после первого её запуска? Я гуглил и даже нашёл какой-то код, но он не работает. Если кому-то...

Автозагрузка программы с правами администратора
Написал программу, которую нужно запускать от имени администратора, чтобы она полноценно работала. Как ее так поставить в автозагрузку...

Автозагрузка на чистом WINAPI
Код: program Project1; uses Windows; {$R *.res} var myRegPath :String =...

Автозагрузка
Как прописать свою прогу в автозагрузку. И если есть названия исполняемых файлов в виде Project1.exe как узнать висят они в процессах или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru