Отправляет email-рассылки с помощью сервиса Sendsay

Borland C++ Builder - всякая всячина

  Все выпуски  

Borland C++ Builder всякая всячина (Автозагрузка)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Приветствую всех получателей рассылки Borland C++ Builder всякая всячина!

Сегодня мы в общих чертах рассмотрим вопрос об автозапуске нашей программы. На днях сам столкнулся с данной проблемой (нужно было запустить вместе с Windows программу-драйвер слежения за com-портом машины). Несмотря на простоту вопроса, при реализации вылезли некоторые непонятные глюки, о котовых я и хочу поведать.

Итак, прежде всего, хочу заметить, что способов реализации автозапуска оказалось 2: через реестр и через папку "Автозагрузка". У обоих оказалось несколько достоинств и недостатков, поэтому решение - на каком способе остановиться, оставляю за вами. Итак, рассмотрим первый способ:


Автозапуск через реестр: Особенностью данного метода является является наличие навыков работы с реестром (всех закричавших "У-у-у-у-у..." попрошу успокоиться - вопрос, на самом деле выеденного яйца не стоит и реализуется в Билдере двумя строчками). Прежде всего определимся - куда и что мы будем писать. В реестре, который построен в виде дерева, есть ветвь HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion, в которой собрано очень много сладких параметров функционирования оболочки (кстати, ветвь HKEY_LOCAL_MACHINE в некоторых источниках называется сокращенно HKLM, что первое время вводило меня в заблуждение; в любом случае, в программе вы должны использовать полное название ветви). Итак, открыв данную ветвь в редакторе реестра RegEdit, который находится в системном каталоге (C:\WINDOWS\REGEDIT.EXE), вы увидите, в числе прочих, следующие параметры:
Run
RunOnce
RunServices
RunServicesOnce
Два первых параметра запускают вашу программу в тот момент, когда вы прошли регистрацию в системе (Пользователь, Пароль), и на экране появляется рабочий стол (именно таким способом грузится "SysTray"). Эти параметры целесообразно использовать для автозагрузки, если ваша программа обеспечивает какие-то дополнительные возможности пользователю, сидящему за компьютером, например: слежение за состоянием почтового ящика, запуск заданий в определенное время и т.д. Вторая группа параметров RunServices и RunServicesOnce запускает вашу программу до появления окна регистрации в системе и предназначена для задач, которые не требуют вмешательства пользователя в процесс их работы. Свой "драйвер" я отнес именно к таким задачам. Также, эти параметры просто необходимы, если ваша программа работает на каком-либо сервере, где нет монитора и, соответственно, сидящего за ним пользователя, а вход в систему с появлением рабочего стола нежелателен по вопросам безопасности. Приведенные четыре параметра можно также разбить на две группы по другому критерию. Дело в том, что параметры RunOnce и RunServicesOnce запускают программу только один раз при старте системы, а затем информация, содержащаяся в них удаляется. Это свойство можно использовать, например для вывода окна с напоминанием о необходимости зарегистрировать программу при первом запуске системы после инсталляции такой программы. Еще один момент: если ваша программа будет работать под WinNT или Win2000, то доступ к ветви HKEY_LOCAL_MACHINE "по записи" пользователь сможет получить, только если он обладает соответствующими правами (Администратор). Поэтому, позаботьтесь, чтобы перед записью в реестр пользователь получил соответствующее предупреждение. Итак - "куда писать" - мы разобрались, переходим к вопросу "Что писать":

Borland C++ Builder содержит в модуле registry.pas библиотеки VCL специальный класс TRegIniFile для упрощения доступа к реестру. Для того, чтобы использовать этот класс в работе своей программы, вы, естественно, должны включить в свой хидер-файл директиву

#define <registry.hpp>

Все остальные действия вы должны будете выполнить уже в той функции, которая будет осуществлять запись в реестр, например:

void __fastcall Form1::Button1Click(TObject *Sender)
{
    ......
    AnsiString ParamName= "Run";  //Один из четырех рассмотренных выше параметров
    AnsiString FileName= "c:\\Program Files\\My Program\\Start.exe";  //Полный путь к вашей программе
    TRegIniFile *RegFile= new TRegIniFile("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion");
    RegFile->WriteString(ParamName, "MyProgram", FileName);
    RegFile->Free();
    ......
}

В первых двух строках приведенного примера объявляются строковые переменные ParamName и FileName. Первая должна содержать один из параметров, которые мы обсуждали выше: Run, RunOnce, RunServices или RunServicesOnce. Во второй вы должны указать полный путь к вашему файлу на диске. Поскольку эта строка является полным аналогом командной строки, вы можете после имени файла через пробел указать несколько параметров, например: "format c:/s" (шутка). В следующей строке мы создаем переменную типа TRegIniFile, конструктору которой передаем в качестве параметра название ветви, где хранятся сведения об автозапуске. К сожалению, вы не можете создать в программе статическую переменную (TRegIniFile RegFile;), поскольку библиотека VCL вводит несколько ограничений, одно из которых гласит: "Все объекты VCL должны создаваться динамически с помощью указателя на объект и оператора new. В четвертой строке примера производится непосредственная запись строкового параметра в раздел реестра с помощью метода WriteString. Ему передается 3 параметра: Имя подключа в ветке, указанной нами в конструкторе, название нового параметра (произвольное имя), содержимое параметра (в нашем случае - путь к автоматически запускаемому файлу). Последняя строчка "закрывает" файл реестра, уничтожает объект TRegIniFile и обнуляет его указатель.
Несколько замечаний:

  • Не забывайте в строковых переменных дублировать знак обратного слеша "\".
  • Использование вместо оператора delete (delete RegFile;) метода Free (стандартного деструктора класса TObject) - это дело "вкуса". Мне больше нравится метод Free, поскольку он корректно обрабатывает ошибку отсутствия объекта (то есть, если указатель содержит NULL).
  • Вы можете вынести параметр Run (RunServices...) в название ветки, передаваемое конструктору, в этом случае первый параметр функции WriteString должен быть равен "".

После того, как вы откомпилируете и выполните программу с приведенным кодом, откройте RegEdit (он, кстати, автоматически перейдет к той ветке, которую вы редактировали в последний раз). Вы увидите, что в подключе Run (RunServices...) появился новый строковый параметр: "MyProgram" который содержит путь к вашему файлу "c:\Program Files\My Program\Start.exe".

Часто бывает необходимо, чтобы пользовательмог сам выбирать, включать ему или нет вашу программу в аытозагрузку. Для реализации этой возвожности добавьте в форму настроек CheckBox, с названием "Загружать программу вместе с Windows". При сохранении настроек выполните следующий код:

    ......
    AnsiString ParamName= "Run";
    AnsiString FileName= "c:\\Program Files\\My Program\\Start.exe";
    TRegIniFile *RegFile= new TRegIniFile("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion");
    if(CheckBox1->Checked) RegFile->WriteString(ParamName, "MyProgram", FileName);
    else RegFile->DeleteKey(ParamName, "MyProgram");
    RegFile->Free();
    ......

Если вас беспокоит вопрос, как будет удаляться параметр, если его не существует, то не беспокойтесь: если его нет, то метод DeleteKey сработает вхолостую, а метод WriteString создаст новый параметр с таким именем, а если он существует, метод WriteString просто обновит его содержимое.

Вот, наверное, и все, что можно сказать по первому способу автозапуска программ. Как видите, страшно только думать о том, что можно "залезть" в реестр, а на самом деле он (реестр) белый и пушистый. Переходим ко второму методу:


Автозапуск через папку "Автозагрузка": Этот способ реализуется через фукнкцию CreateFileLink вспомогательной библиотеки RxLib (www.rxlib.com), описанную в файле Fileutil.hpp. Соответственно, чтобы использовать эту функцию, включите в вашу программу директиву

#include <Fileutil.hpp>

После этого в методе форме параметров, который сохраняет выбранные настройки нарисуйте следующий код:

    ......
    AnsiString FileName= "c:\\Program Files\\My Program\\Start.exe";  //Полный путь к вашей программе
    AnsiString ProgramName= "MyProgram";  //Название вашей программы
    DeleteFileLink(ProgramFile, CSIDL_STARTUP);
    if(CheckBox1->Checked) CreateFileLink(FileName, ProgramName, CSIDL_STARTUP);
    ......

С первой строкой все ясно, во второй строке создается строковая переменная, содержащая имя вашей программы, которое вы сможете увидеть, открыв меню "Пуск" -> "Программы" -> "Автозагрузка". В третьей строчке из папки "Автозагрузка" удаляется наш ярлык (если он там есть). Константа CSIDL_STARTUP указывает, что работа проводится именно с папкой "Автозагрузка", то есть, используя функции CreateFileLink и DeleteFileLink, вы можете работать с любыми ярлыками, расположенными в спецпапках ("Панель управления", "Избранное", "Автозагрузка" и т.д.). Все эти константы прописаны в файле shlobj.h, расположенном в папке ($BCB)\Include, где ($BCB) - путь к установленному у вас Билдеру ("c:\Program Files\Borland\CBuilder5"). Далее, если пользователь установил галочку на CheckBoxе, мы с помощью функции CreateFileLink вновь создаем ярлык к нашей программе в папке "Автозагрузка". Даже не знаю, что еще сказать-то по этому поводу - "элементарнейше"...


Второй рассмотренный нами способ дает одно неоспоримое преимущество: пользователь явно может контролировать содержимое своей папки "Автозагрузка" (лично я предпочитаю знать, кто, где, куда у меня на машине прописался). Он также позволяет работать и с другими спецпапками, например, добавлять ярлыки на рабочий стол. В то же время, первый способ имеет свои достоинства (запуск до регистрации, однократный запуск...). Решать вам. Можно, наконец, предложить пользователю выбор: запуск через реестр до появления окна регистрации, либо запуск через папку "Автозагрузка" и всю вашу любовь к нему...

Вот, наверное, и все, что я сам хотел бы знать об автозагрузке. Дерзайте, пишите, ломайте реестр (бога ради, сделайте с него копию: с:\Windows\System.dat).



С уважением, Васильев Евгений...

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное