Autorun.exe та .ini-файли. Коди програми
Написано на Delphi 3.0
Приклад файлів: Unit1.pas List01.ini Зкачати все.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ComCtrls,IniFiles, ExtCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ListBox1: TListBox;
ListBox2: TListBox;
RichEdit1: TRichEdit;
Label1: TLabel;
Timer1: TTimer;
BitBtn3: TBitBtn;
procedure FormActivate(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure ListBox2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
var
//Здесь размещаются переменные, которые
будут доступны из всех процедур.
RunPathList:
array[1..999] of
String; //Список
путей к запускаемым файлам.
DescriptionList:
array[1..999] of
String; //Список
описаний или пути к описаниям.
ListFile:
array[1..99] of String; //Список
файлов с
информацией
Path:String;
//Корневой каталог диска.
procedure
TForm1.FormActivate(Sender: TObject); //Сама
процедура (начало)
var
//Тут размещаются переменные, которые
будут доступны в пределах этой процедуры.
i,n,k,Found:integer;
//Различные переменные счетчиков
SearchRec:TSearchRec;
//Переменная используемая при поиске
ini:TIniFile;
//Определения класса для работы с .ini
файлами
Category,Name,Description,RunPath:String;
//думаю, понятно
из названий
begin
label1.Caption:='0';
//Тут будет количество найденных программ
Path:=ParamStr(0);//ParamStr(n),
где n>=0.
При n=0
возвращает путь и имя файла к нашей
запущенной программе. При n>0
возвращает параметры, которые были
переданы программе при запуске (Например: «autorun.exe
/param1 name»).
Функция ParamCount возвращает количество
параметров разделенных пробелом (т.е. n=0...ParamCount).
Path:=Path[1]+':\';//Выделяем
логический диск. Это первый символ. К нему
добавляем приставку «:\»
i:=1;
Found
:= FindFirst(Path+'list??.ini', faVolumeID, SearchRec);//Поиск
первого файла
по маске
х:\list??.ini
while
Found = 0 do
//Зацикливаемся,
пока есть новые файлы
begin
if
FileExists(Path+SearchRec.Name)=true then //Проверяем,
что найден
файл
begin
ListFile[i]:=Path+SearchRec.Name;//Добавляем
в список
файлов типа
list??.ini
Inc(i);
//Увеличиваем переменную і на единицу
end;
Found
:= FindNext(SearchRec);
end;
FindClose(SearchRec);
//Освобождаем память
ListFile[i]:='END';
//Добавляем текст «END»
в список файлов. Для того, чтобы потом
быстро определить конец списка.
if
ListFile[1]='END'
then
ShowMessage('На
диске '+Path+'
не найдено ни одного конфигурационного
файла.'); //Если в первой строчке списка «END»,
значит не найдено ни одного файлаL.
Выводим сообщение.
k:=1;
for
i:=1 to
99 do //Перебираем
список от 1 до 99 в цикле
begin
if
ListFile[i]='END' then Break; //пока
не встретим
«END»
ini:=TIniFile.Create(ListFile[i]);
//Открываем файл
label1.Caption:=IntToStr(StrToInt(label1.Caption)+ini.ReadInteger('MAIN','ProgramsCount',0));
//Увеличиваем количество
программ в
файле
for
n:=1 to ini.ReadInteger('MAIN','ProgramsCount',0) do //Перебираем
все записи
с 1 до
значения «ProgramsCount»,
указаного в
файле.
begin
Category:=ini.ReadString('Program'+Format('%.3d',[n]),'Category','без
категории');//Считываем
категорию. Функцией
«Format» в
данном случае задается формат чисел типа:
001,002,003...
if
ListBox1.Items.IndexOf(Category)
= -1 then
//Выполняем поиск такой же категории
уже находящейся в списке ListBox1.
В случае удачи функция возвращает номер
позиции, в противном случае «–1»
begin
ListBox1.Items.Add(Category);//Если
нету - добавляем
end;
end;
end;
ini.Free;
label1.Caption:='На
этом диске '+label1.Caption+'
программ(а).';//Делаем надпись более
информативной для пользователя
end;
procedure
TForm1.ListBox1Click(Sender: TObject);
var
ini:TIniFile;
i,n,k:integer;
Category:String;
begin
k:=1;
ListBox2.Items.Clear;//Очищаем
все строчки
ListBox2
RichEdit1.Text:='';//Очищаем
окно с описанием
Label1.Caption:='';
for
i:=1 to 99 do
begin
if
ListFile[i]='END' then Break;
ini:=TIniFile.Create(ListFile[i]);
for
n:=1 to ini.ReadInteger('MAIN','ProgramsCount',0) do
begin
Category:=ini.ReadString('Program'+Format('%.3d',[n]),'Category','без
категории');
if
Category = ListBox1.Items.Strings[ListBox1.ItemIndex]
then //Если
найденная в файле категория совпадает с
выбранной в ListBox1,
то считывается информация о программе
begin
//ListBox2.Items.Add(Format('%.4d',[k])+'
'+ini.ReadString('Program'+Format('%.3d',[n]),'Name','без
имени')); //Считываем
Имя
программы ListBox2.Items.Add(ini.ReadString('Program'+Format('%.3d',[n]),'Name','без
имени')); //которое
добавляется в
список ListBox2
RunPathList[k]:=Path+ini.ReadString('Program'+Format('%.3d',[n]),'Path','неизвестно');
//Путь, для
запуска выбранной
пользователем программы
DescriptionList[k] :=ini.ReadString('Program'+Format('%.3d',[n]),'Description','Все
ясно из
названия!');
//Описание выбранной
программы
Inc(k);
end;
end;
end;
ini.Free;
end;
procedure
TForm1.ListBox2Click(Sender: TObject);
var
n:integer;
begin
screen.Cursor:=crHourGlass;
//Устанавливаем вид курсора «песочные
часы»
Label1.Caption:=RunPathList[ListBox2.ItemIndex+1];
//Строка запуска
программы
if
FileExists(Path+DescriptionList[ListBox2.ItemIndex+1]) then //Если
файл существует
RichEdit1.Lines.LoadFromFile(Path+DescriptionList[ListBox2.ItemIndex+1])
//открываем его
else
RichEdit1.Text:=DescriptionList[ListBox2.ItemIndex+1]; //иначе
выводим текст
в поле
описания
screen.Cursor:=crDefault;
//Устанавливается вид курсора «по
умолчанию»
end;
procedure
TForm1.BitBtn1Click(Sender: TObject);
var
Result:Integer;
begin
Result:=Windows.WinExec(PChar(Label1.caption),SW_SHOWDEFAULT);
//Запускаем на выполнение программу, путь
и имя которой мы предварительно занесли в
текст метки Label1.
Результат выполнения операции
возвращается переменной Result.
Далее идет обработка возможных ошибок
if
Result=0 then
MessageDlg('Недостаточно
ресурсов для запуска программы',mtError,[mbOk],0);
if
Result=ERROR_BAD_FORMAT then MessageDlg('Неправильный
формат .ЕХЕ
файла',mtError,[mbOk],0);
if
Result=ERROR_FILE_NOT_FOUND then MessageDlg('Файл
не найден'#13#10+Label1.Caption,mtError,[mbOk],0);
if
Result=ERROR_PATH_NOT_FOUND then MessageDlg('Неверный
указанный путь'#13#10+Label1.Caption,mtError,[mbOk],0);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
X,Y,C,R,G,B:Integer;
i:integer;
begin
Randomize;
for i:=0 to 11 do
begin
X:=Random(Screen.Width);
Y:=Random(Screen.Height);
C:=GetPixel(GetDC(0),X,Y);
R:=GetRValue(C);
G:=GetGValue(C);
B:=GetBValue(C);
if R>105 then R:=R-100;
if G>105 then G:=G-100;
if B>105 then B:=B-100;
C:=RGB(R,G,B);
SetPixel(GetDC(0),X,Y,C);
end;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Form2.ShowModal;
end;
end.
25.08.2007