Чтение онлайн

на главную

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

procedure TDKSViewMainForm.SetAssociation(Reg: TRegistry);

begin

 Reg.OpenKey('\' + FileExt, True);

 Reg.WriteString('' , FileDescr);

 Reg.OpenKey('\' + FileDescr, True);

 Reg.WriteString(FileTitle);

 Reg.OpenKey('Shell', True);

 Reg.OpenKey('Open', True);

 Reg.WriteString('', OpenCommand);

 Reg.OpenKey('command', True);

 Reg.WriteString('', '"' + ParamStr(0) + '" "%1"');

 Reg.OpenKey('\' + FileDescr, True);

 Reg.OpenKey('Shell', True);

 Reg.OpenKey('View', True);

 Reg.WriteString('', ViewCommand);

 Reg.OpenKey('command', True);

 Reg.WriteString('' + ParamStr(0) + '" "%1" /v');

 Reg.OpenKey('\' + FileDescr, True);

 Reg.OpenKey('DefaultIcon', True);

 Reg.WriteString('', ParamStr(0) + ',0');

end;

1.3.2.2.

Командная строка

Командная строка досталась Windows по наследству от DOS. Там основным средством общения пользователя с системой был ввод команд с клавиатуры. Команда запуска приложения выглядела так:

<Имя приложения> <Строка параметров>

Строка параметров — это произвольная строка, которая без изменений передавалась программе. От имени программы она отделялась пробелом (пробелы в именах файлов и директорий в DOS не допускались). Разработчик конкретного приложения мог, в принципе, интерпретирован, эту строку как угодно, но общепринятым стал способ, когда строка разбивалась на отдельные параметры, которые разделялись пробелами. Вид и смысл параметров зависел от конкретной программы. В качестве параметров нередко передавались имена файлов, с которыми должна была работать программа.

В Windows мало что изменилось — функции

CreateProcess
и
ShellExecute
, запускающие приложение, по-прежнему используют понятие командной строки. Разве что теперь максимальная длина строки стала существенно больше, и командную строку можно получить в кодировке Unicode. Но, как и раньше, разделителем параметров считается пробел. Однако теперь пробел может присутствовать и в имени файла, как в имени самой программы, так и в именах файлов, передаваемых в качестве параметров. Чтобы отличать такой пробел от пробела-разделителя, параметры, содержащие пробелы, заключаются в двойные кавычки. Если имя программы содержит пробелы, они тоже заключаются в двойные кавычки. И, конечно же, если в кавычки окажется заключенным параметр, в котором нет пробелов, хуже от этого не будет.

Для работы с параметрами командной строки в Delphi существуют две стандартные функции:

ParamCount
и
ParamStr
. Функция
ParamCount
возвращает количество параметров, переданных в командной строке.
ParamStr
— параметр с заданным порядковым номером. Параметры нумеруются начиная с единицы, нулевым параметром считается имя самой программы (при подсчетах с помощью
ParamCount
этот "параметр" не учитывается). Эти функции осуществляют разбор командной строки по описанным ранее правилам: разделитель —пробел, за исключением заключенных в кавычки. Кавычки, в которые заключен параметр, функция
ParamStr
не возвращает.

Ассоциированный файл запускается с помощью механизма командной строки. В реестр записывается командная строка (вместе с именем приложения), в которой имя открываемого файла заменяется на

%1
.
Когда пользователь запускает ассоциированный файл (или он запускается приложением через
ShellExecute
), система извлекает из реестра соответствующую командную строку, вместо
%1
подставляет реальное имя файла и пытается выполнить получившуюся команду. Отметим, что если имя файла содержит пробелы, в кавычки оно автоматически не заключается, поэтому о кавычках приходится заботиться самостоятельно, заключая в них
%1
. Таким образом, в реестр в качестве командной строки должно записываться следующее

<Имя программы> "%1"

Если существуют разные варианты запуска одного файла (т.е. как в нашем случае — open и view), они различаться дополнительным параметрами. В частности, в нашем примере для открытия для редактирования не будут требоваться дополнительные параметры, для открытия для просмотра в качестве второго параметра должен передаваться кляч v, т.е. в реестр для этой команды будет записана такая строка:

<Имя программы> "%1" v

Программа должна анализировать переданные ей параметры и открывать соответствующий файл в требуемом режиме. В нашем случае этот код выглядит очень просто (листинг 1.47).

Листинг 1.47. Анализ командной строки

procedure TDKSViewMainForm.FormShow(Sender: TObject);

var

 OpenForView: Bооlean;

begin

 // Проверяем наличие ключа "/v" в качестве второго параметра

 OpenForView := (ParamCount > 1) and (CompareText(ParamStr(2), '/v') = 0);

 if ParamCount > 0 then OpenFile(ParamStr(1), OpenForView);

 ...

end;

B более сложных случаях (например, при большем числе команд для ассоциированного файла) анализ командной строки будет сложнее, но его принципы останутся теми же.

1.3.2.3. Поиск уже запущенной копии приложения

Во многих случаях желательно не давать пользователю возможности запустить второй экземпляр вашего приложения. В 16-разрядных версиях Windows все приложения выполнялись в одной виртуальной машине, и каждому из них через переменную

HPrevInstance
передавался дескриптор предыдущей копии. По значению
HPrevInstance
программа легко могла найти свой предыдущий экземпляр или определить, что других экземпляров нет, если
HPrevInstance
равна нулю. В 32-разрядных версиях эта переменная для совместимости оставлена, но всегда равна нулю, т.к. предыдущая копия работает в своей виртуальной машине, и ее дескриптор не имеет смысла. Альтернативного механизма обнаружения уже запущенной копии система не предоставляет, приходится выкручиваться своими силами.

Для обнаружения уже запущенного приложения многие авторы предлагают использовать именованные системные объекты (мьютексы, семафоры, атомы и т.п.). При запуске программа пытается создать такой объект с определенным именем. Если оказывается, что такой объект уже создан, программа "понимает", что она — вторая копия, и завершается. Недостаток такого подхода — с его помощью можно установить только сам факт наличия предыдущей копии, но не более того. В нашем случае задача шире: при запуске второго экземпляра приложения должен активизироваться первый, а если второму экземпляру была передана непустая командная строка, первый должен получить эту строку и выполнить соответствующее действие, поэтому описанный способ нам не подходит.

Поделиться:
Популярные книги

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

(не)Бальмануг. Дочь 2

Лашина Полина
8. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не)Бальмануг. Дочь 2

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Книга пятая: Древний

Злобин Михаил
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Книга пятая: Древний

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Аномальный наследник. Том 3

Тарс Элиан
2. Аномальный наследник
Фантастика:
фэнтези
7.74
рейтинг книги
Аномальный наследник. Том 3

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2