Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 36

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

<Имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹> "%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-разрядных вСрсиях эта пСрСмСнная для совмСстимости оставлСна, Π½ΠΎ всСгда Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ, Ρ‚.ΠΊ. прСдыдущая копия Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² своСй Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС, ΠΈ Π΅Π΅ дСскриптор Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° обнаруТСния ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ систСма Π½Π΅ прСдоставляСт, приходится Π²Ρ‹ΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ своими силами.

Для обнаруТСния ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ прилоТСния ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ систСмныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹, сСмафоры, Π°Ρ‚ΠΎΠΌΡ‹ ΠΈ Ρ‚.ΠΏ.). ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пытаСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Если оказываСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ создан, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° "ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚", Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° β€” вторая копия, ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. НСдостаток Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° β€” с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сам Ρ„Π°ΠΊΡ‚ наличия ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΏΠΈΠΈ, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ. Π’ нашСм случаС Π·Π°Π΄Π°Ρ‡Π° ΡˆΠΈΡ€Π΅: ΠΏΡ€ΠΈ запускС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ экзСмпляра прилоТСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π° Ссли Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ экзСмпляру Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° нСпустая командная строка, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эту строку ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ дСйствиС, поэтому описанный способ Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ ящики (mailslots). Π­Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ систСмныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для одностороннСй ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями (Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ с элСктронной ΠΏΠΎΡ‡Ρ‚ΠΎΠΉ эти ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ ящики Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚). Под сообщСниСм здСсь ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π½Π΅ сообщСния Windows, Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… (здСсь большС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ скорСС Ρ‚Π΅Ρ€ΠΌΠΈΠ½ "Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°", Π° Π½Π΅ "сообщСниС"). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя. Алгоритм отслСТивания ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ запуска с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ящика ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пытаСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик ΠΊΠ°ΠΊ сСрвСр. Если оказываСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ящик ΡƒΠΆΠ΅ сущСствуСт, Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ содСрТимоС своСй ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π‘Π΅Ρ€Π²Π΅Ρ€ΠΎΠΌ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС становится экзСмпляр прилоТСния, Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, β€” ΠΎΠ½-Ρ‚ΠΎ ΠΈ создаёт ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ экзСмплярам останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ случаС Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ систСма сама Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ всС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Сю дСскрипторы, поэтому Π΄Π°ΠΆΠ΅ Ссли пСрвая копия Π±ΡƒΠ΄Π΅Ρ‚ снята систСмой ΠΈ Π½Π΅ смоТСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ дСскриптор ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ящика, ящик Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ ΠΈ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ копию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Ρ„ΠΎΡ€ΠΌΡ‹, Π° Π² основном ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ программист Π½Π΅ исправляСт. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΠ΄ Π² dpr-Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 1.48.

Листинг 1.48 Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ящика Π² Π³Π»Π°Π²Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

const

 MailslotName = '\\.\mailslot\DelphiKingomSample_Viewer_FileCommand';

 EventName = 'DelphiKingdomSamplΠ΅_Viewer_Command_Event';


var

 ClientMailslotHandle: THandle;

 Letter: string;

 OpenForView: Boolean;

 BytesWritten: DWORD;

begin

 // ΠŸΡ‹Ρ‚Π°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик

 ServerMailslotHandle := CreateMailSlot(MailslotName, 0,

  MAILSLOT_WAIT_FOREVER, nil);

 if ServerMailslotHandle = INVALID_HANDLE_VALUE then

 begin

  if GetLastError = ERROR_ALREADY_EXISTS then

  begin

   // Если Ρ‚Π°ΠΊΠΎΠΉ ящик ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ Π½Π΅ΠΌΡƒ, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚

   ClientMailslotHandle := CreateFile(MailslotName, GENERIC_WRITE,

    FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

   // Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ

   // строку для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ экзСмпляру. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ символ

   // строки - ΠΊΠΎΠΌΠ°Π½Π΄Π°:

   // e - ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для рСдактирования

   // v β€” ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» для просмотра

   // s β€” просто Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ экзСмпляр

   // Для ΠΊΠΎΠΌΠ°Π½Π΄ e ΠΈ v ΠΊ строкС, начиная со 2-Π³ΠΎ символа,

   // добавляСтся имя Ρ„Π°ΠΉΠ»Π°

   if ParamCount > 0 then

   begin

    OpenForView := (ParamCount > 1) and

     (CompareText(ParamStr(2), '/v') = 0);

    if OpenForView then Letter := 'v' + ParamStr(1)

    elsΠ΅ Letter := 'e' + ParamStr(1);

   end

   else Letter := 's';

   // ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик

   WriteFile(ClientMailslotHandle, Letter[1], Length(Letter),

    BytesWritten, nil);

   // Π‘ΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ событиС

   CommandEvent := OpenEvent(EVENT_MODIFY_STATE, False, EventName);

   SetEvent(CommandEvent);

   // Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ всС дСскрипторы

   CloseHandle(CommandEvent);

   CloseHandle(ClientMailslotHandle);

  end;

 end

 else

 begin

  // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ событиС для сигнализирования ΠΎ поступлСнии  Π΄Π°Π½Π½Ρ‹Ρ…

  CommandEvent := CreateEvent(nil, False, False, EventName);

  // ВыполняСм ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ для VCL-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ»

  Application.Initialize;

  Application.CreateForm(TDKSViewMainForm, DKSViewMainForm);

  Application.Run;

  // Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ всС дСскрипторы

  CloseHandle(ServerMailslotHandle);

  CloseHandle(CommandEvent);

 end;

end.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ "Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ" ΠΏΠ΅Ρ€Π²ΡƒΡŽ копию прилоТСния ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌ ящикС ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ сообщСния, ΠΈ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ идСально, Ссли ΠΏΡ€ΠΈ поступлСнии Π΄Π°Π½Π½Ρ‹Ρ… главная Ρ„ΠΎΡ€ΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π»Π° Π±Ρ‹ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ сообщСниС, Π½ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°, ΠΊ соТалСнию, Π½Π΅ сущСствуСт. Из полоТСния ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ, задСйствовав события.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Бобытия β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ синхронизации, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π² систСмС. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π·Π²Π΅Π΄Π΅Π½ΠΎ ΠΈ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ΠΎ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitForSingleObject ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти Π½ΠΈΡ‚ΡŒ Π² состояниС оТидания Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€. ΠΏΠΎΠΊΠ° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ событиС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·Π²Π΅Π΄Π΅Π½ΠΎ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ рассмотрСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ нашСй ΠΊΠ½ΠΈΠ³ΠΈ; ΠΎΠ½ΠΈ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ описаны, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² [2].

Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΏΡ€ΠΈ использовании ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° систСма ΠΌΠΎΠΆΠ΅Ρ‚ сама Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ событиС ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΌ ящиком, Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² Windows 9Ρ…/ΠœΠ• ΠΈ Π½Π° ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ ящики Π½Π΅ распространяСтся. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Windows NT/2000/XP, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄.

Бобытия относятся ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, поэтому с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ процСссы. Π’ нашСм случаС пСрвая копия прилоТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CreateEvent создаСт событиС, Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ OpenEvent ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ дСскриптор этого события ΠΈ взводят Π΅Π³ΠΎ. Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сигнал ΠΎ появлСнии Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠΌ ящикС. Для обнаруТСния этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ прилоТСния создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Π½ΠΈΡ‚ΡŒ, которая ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ событиС ΠΈ, доТдавшись, посылаСт Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ сообщСниС (эта Π½ΠΈΡ‚ΡŒ практичСски Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всС врСмя находится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ оТидания, Ρ‚.Π΅. ΠΊΠ²Π°Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π·Π°Π΄Π°Ρ‡ Π΅ΠΉ Π½Π΅ выдСляСт, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ отняла Π±Ρ‹ большС рСсурсов). Π­Ρ‚ΠΎ сообщСниС опрСдСляСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ бСрСтся ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° WM_USER, Ρ‚.ΠΊ. Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ рассылки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ этого сообщСния Ρ„ΠΎΡ€ΠΌΠ° выполняСт ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 1.49.

Листинг 1.49. РСакция Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π° поступлСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ ящик

// РСакция Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… экзСмпляров прилоТСния

procedure TDKSViewMainForm.WMCommandArrived(var Message: TMessage);

var

 Letter: string;

begin

 // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½

 GoToForeground;

 // Пока Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΡ… ΠΈ выполняСм

 Letter := ReadStringFromMailslot;