C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Автозагрузка программы через реестр, при помощи директивы #define...
aquanet sk
  Отправлено: 18.01.2007, 00:26


Станционный диспетчер

Группа: Участник
Сообщений: 87



Доброго времени суток.

Задался задачей вносить запись в реестр не как раньше делал: в десяток строк ( открытие ключей и запись строк), а каким-либо стандартным методом в одну, две строки. В инете нашел следующую директиву:
CODE
#define RUN_KEY_NAME TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")


Подскажите, как ей воспользоваться?

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

Отредактировано aquanet sk — 18.01.2007, 00:38
Valdemar
Отправлено: 18.01.2007, 09:08


Мастер участка

Группа: Участник
Сообщений: 433



Директива препроцессора #define служит для создания символических констант и макросов.
При определении
#define RUN_KEY_NAME TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Run")
перед компиляцией по всему тексту программы RUN_KEY_NAME будет заменено на TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Run"), а потом начнется компиляция программы.
Поэтому RUN_KEY_NAME TEXT можно в данном случае расценивать как константу, которая хранит имя ветки реестра и к способу записи в реестр никакого отношения не имеет.
aquanet sk
  Отправлено: 18.01.2007, 17:38


Станционный диспетчер

Группа: Участник
Сообщений: 87



Привожу обещанный код, готовый к употребелению:
CODE

#include <Registry.hpp>

void __fastcall TForm1::Menu1Click(TObject *Sender)
{
if(Menu1->Checked==true)
{
TRegistry* Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;

Reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",
false);
Reg->DeleteValue("Имя Вашей программы (указанное в функции
WriteString");
Reg->CloseKey();
delete Reg;
Menu1->Checked=false;
}
else
{
TRegistry* Reg = new TRegistry;
Reg->RootKey = HKEY_LOCAL_MACHINE;

Reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run",
true);
Reg->WriteString("Имя Вашей программы (произвольное)",ExtractFilePath
(Application->ExeName)+"\Имя Вашей программы.exe");
Reg->CloseKey();
delete Reg;
Menu1->Checked=true;
}
}


Отредактировано aquanet sk — 20.01.2007, 23:46
aquanet sk
Отправлено: 18.01.2007, 17:44


Станционный диспетчер

Группа: Участник
Сообщений: 87



Valdemar, ясна, а примера, относящегося к данной директиве у Вас нет? И по вопросу данной темы хотелось бы узнать Ваше мнение, можно ли как-то в пару строк уложиться?
Valdemar
Отправлено: 19.01.2007, 11:49


Мастер участка

Группа: Участник
Сообщений: 433



По поводу #define самый простой пример, вычисление длины окружности:
CODE
#define PI 3.1415
#define RADIUS 2.5
void main()
{
  double l;
  l=2*PI*RADIUS;
}

Хотя я с реестром и не работал, но все же думаю, что ваш вариант и так простой.

Отредактировано Valdemar — 19.01.2007, 12:57

Вернуться в Вопросы программирования в C++Builder