ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π² 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Windows

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‡Ρ‚ΠΎ касаСтся подпроцСсса. Бмысл Π΅Π³ΠΎ достаточно прост: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс Π² ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠΌ для Π½Π΅Π³ΠΎ адрСсном пространствС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ процСссы. Π­Ρ‚ΠΈ процСссы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΈ ΠΎΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ°. Однако ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ «ΡƒΠ±ΠΈΡ‚ΡŒ» любой ΠΈΠ· ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΈΠΌ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠ². Π’Π°ΠΊΠΈΠ΅ процСссы Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Ρ‰Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ нитями. Однако… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π² 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Windows (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

  • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
  • 1 ВСорСтичСскоС обоснованиС
    • 1.1 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния
    • 1.2 ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
    • 1.3 ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Windows
  • 2. ДСмонстрационная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
    • 2.1 Листинг
    • 2.2 ДСмонстрация Ρ€Π°Π±ΠΎΡ‚Ρ‹
  • Π’Ρ‹Π²ΠΎΠ΄

ЦСлью курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ являСтся ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ основ программирования Π½Π° 32-Π±ΠΈΡ‚Π½ΠΎΠΌ ассСмблСрС, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠžΠ‘ WINDOWS.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° со ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ°ΠΌΠΈ WINDOWS, рассмотрСны ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡ… ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, основанныС Π½Π° API-функциях. На ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ описанных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

1. ВСорСтичСскоС обоснованиС

1.1 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ полоТСния программирования Π² ΠžΠ‘ WINDOWS:

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Windows основываСтся Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API (ApplicationProgramInterface, Ρ‚. Π΅. интСрфСйс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ прилоТСния). Π˜Ρ… ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ достигаСт Π΄Π²ΡƒΡ… тысяч. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни состоит ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ВсС взаимодСйствиС с Π²Π½Π΅ΡˆΠ½ΠΈΠΌΠΈ устройствами ΠΈ Ρ€Π΅ΡΡƒΡ€ΡΠ°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы происходит посрСдством Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API ΠΈ ΠΈΡ… ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ пСрСчислСн Π² Ρ„Π°ΠΉΠ»Π΅ WIN32. HLP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ поставляСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Borland C++.

Π“Π»Π°Π²Π½Ρ‹ΠΌ элСмСнтом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΡΡ€Π΅Π΄Π΅ Windows являСтся ΠΎΠΊΠ½ΠΎ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° опрСдСляСтся своя ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний.

Окно ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ элСмСнты управлСния: ΠΊΠ½ΠΎΠΏΠΊΠΈ, списки, ΠΎΠΊΠ½Π° рСдактирования ΠΈ Π΄Ρ€. Π­Ρ‚ΠΈ элСмСнты, ΠΏΠΎ ΡΡƒΡ‚ΠΈ, Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠΊΠ½Π°ΠΌΠΈ, Π½ΠΎ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ особыми свойствами. Бобытия, происходящиС с ΡΡ‚ΠΈΠΌΠΈ элСмСнтами (ΠΈ ΡΠ°ΠΌΠΈΠΌ ΠΎΠΊΠ½ΠΎΠΌ), приводят ΠΊ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Ρƒ сообщСний Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΎΠΊΠ½Π°.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма Windows ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ модСль памяти. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, всю ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ сСгмСнт. Для программиста Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ ассСмблСра это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ адрСс любой ячСйки памяти Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ содСрТимым ΠΎΠ΄Π½ΠΎΠ³ΠΎ 32-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ рСгистра, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ EBX.

БлСдствиСм ΠΏΡƒΠ½ΠΊΡ‚Π° 5 являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ фактичСски Π½Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ±ΡŠΠ΅ΠΌΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ стСка (объСмС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…). Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² Ρ‚СкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сСгмСнта ΠΊΠΎΠ΄Π° ΠΈ ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… являСтся Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ простой Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, ΡƒΠ»ΡƒΡ‡ΡˆΠ°ΡŽΡ‰Π΅ΠΉ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма Windows являСтся ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠΉ срСдой. КаТдая Π·Π°Π΄Π°Ρ‡Π° ΠΈΠΌΠ΅Π΅Ρ‚ своС адрСсноС пространство ΠΈ ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π°ΠΆΠ΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ осущСствлСна ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ — любая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π°.

1.2 ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ API Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ способом, схоТим с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π² ΡΠ·Ρ‹ΠΊΠ°Ρ… высокого уровня. Для этого всС ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² ΡΡ‚Π΅ΠΊ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

НапримСр, функция:

intMessageBox (HWNDhWnd, LPCTSTRlpText, LPCTSTRlpCaption, UINTuType);

Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

includelib user32. lib

EXTERN MessageBoxA@16:NEAR

ΠœΠ’_ОК equ 0

STR1 DB «ΠΠ΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄! «, 0

STR2 DB «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.», 0

HW DWORD ?

PUSH ΠœΠ’_ОК

PUSH OFFSET STR1

PUSH OFFSET STR2

PUSH HW

CALL MessageBoxA@16

Π’ Ρ‚Π°ΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MessageBox добавляСтся символ А, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ANSI-стандарт, символ @ Π² Ρ€ΠΎΠ»ΠΈ раздСлитСля ΠΈ Ρ‡ΠΈΡΠ»ΠΎ N Π² ΠΊΠΎΠ½Ρ†Π΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ количСство Π±Π°ΠΉΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· стСк.

На Π·Π°ΠΌΠ΅Π½Ρƒ стандартному Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CALL Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Π΅ MASM Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° INVOKE. Π’Ρ‹Π·ΠΎΠ²Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

PUSH par1

PUSH par2

PUSH par3

PUSH par4

CALL NAME_PROC@N

ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²ΠΈΠ΄:

INVOKE NAME_PROC, par4, par3, par2, par1

ΠŸΡ€ΠΈ этом функция ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Π΅:

PROC PROTO: DWORD, :DWORD, :DWORD, :DWORD

Π’ΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

includelib user32. lib

MessageBoxAPROTO :DWORD, :DWORD, :DWORD, :DWORD,

ΠœΠ’_ОК equ 0

STR1 DB «ΠΠ΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄! «, 0

STR2 DB «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.», 0

HW DWORD ?

INVOKE MessageBoxA, HW, OFFSET STR1, OFFSET STR2, MB_OK

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ структуры. Π’Π°ΠΊ, структурС:

typedefstructtagMSG { // msg

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

соотвСтствуСткод:

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCTENDS

1.3 ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Windows

Π”Π°Π»Π΅Π΅ рассмотрСна основная структура ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ имССтся Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π’ Ρ†Π΅Π»ΠΎΠΌ, Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сСкции:

Β· РСгистрация класса ΠΎΠΊΠΎΠ½

Β· Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

Β· Π¦ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний

Β· ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

РСгистрация класса ΠΎΠΊΠΎΠ½. РСгистрация класса ΠΎΠΊΠΎΠ½ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterClassA, СдинствСнным ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ WNDCLASS, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠΊΠ½Π΅.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°. На ΠΎΡΠ½ΠΎΠ²Π΅ зарСгистрированного класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateWindowExA (ΠΈΠ»ΠΈ CreateWindowA) ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр ΠΎΠΊΠ½Π°. Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, это вСсьма Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль программирования.

Π¦ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний. Ѐункция GetMessage () «ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚» ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ сообщСниС ΠΈΠ· Ρ€ΡΠ΄Π° сообщСний Π΄Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ MSG.

Π§Ρ‚ΠΎ касаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TranslateMessage, Ρ‚ΠΎ Π΅Π΅ ΠΊΠΎΠΌΠΏΠ΅Ρ‚Снция касаСтся сообщСний WM_KEYDOWN ΠΈ WM_KEYUP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² WM_CHAR ΠΈ WM_DEADCHAR, Π° Ρ‚Π°ΠΊΠΆΠ΅ WM_SYSKEYDOWN ΠΈ WM_SYSKEYUP, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Π² WM_SYSCHAR ΠΈ WM_SYSDEADCHAR. Бмысл трансляции Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π½Π΅ Π² Π·Π°ΠΌΠ΅Π½Π΅, Π° Π² ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сообщСний. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΈ ΠΎΡ‚пускании Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ клавиши Π² ΠΎΠΊΠ½ΠΎ сначала ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ сообщСниС WM_KEYDOWN, Π·Π°Ρ‚Π΅ΠΌ WM_KEYUP, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΆΠ΅ WM_CHAR.

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ мСсто Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли функция GetMessage Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. Π­Ρ‚ΠΎ происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ (сообщСниС WM_QUIT). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ†ΠΈΠΊΠ» оТидания ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π΄Π²ΠΎΡΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ сообщСния, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΠΊΠ½Π°, ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ся сообщСниС ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

MSG_LOOP:

INVOKE GetMessageA, OFFSET MSG, 0,0,0

CMP AX, 0

JE END_LOOP

INVOKE TranslateMessage, OFFSET MSG

INVOKE DispatchMessageA, OFFSET MSG

JMP MSG_LOOP

END_LOOP:

INVOKE ExitProcess,[MSG.MSWPARAM]

_ERR:

JMP END_LOOP

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠžΠΏΠΈΡΡ‹Π²Π°Π΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

WNDPROC PROC

PUSH EBP

MOV EBP, ESP; Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ EBP ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка

PUSH EBX

PUSH ESI

PUSH EDI

PUSH DWORD PTR [EBP+14H]; LPARAM (lParam)

PUSH DWORD PTR [EBP+10H]; WPARAM (wParam)

PUSH DWORD PTR [EBP+0CH]; MES (message)

PUSH DWORD PTR [EBP+08H]; HWND (hwnd)

CALL DefWindowProcA@16

POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ часто Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Ρƒ стандартному ΠΎΠΊΠ½Ρƒ, ΠΈΡ… ΠΏΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Π² Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΉ простотС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ срСд Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ созданиС Ρ„Π°ΠΉΠ»Π° рСсурсов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ графичСского Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π±Π΅Π· использования Ρ„Π°ΠΉΠ»Π° рСсурсов:

Β· ОпишСм ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ DlgProc PROTO: DWORD:DWORD:DWORD:DWORD

Β· ОпишСм Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ :

Dialog «Scrolling text multithreading» ,

" MS Sans Serif", 10,

WS_OVERLAPPED or

WS_SYSMENU or DS_CENTER,

3,

50,50,200,100,

DlgButton «Run thread», WS_TABSTOP, 150,5,40,13,IDOK

DlgButton «Shut off», WS_TABSTOP, 150,20,40,13,IDSTOP

DlgButton «Start regedit», WS_TABSTOP, 150,35,40,13,IDPROC

DlgButton «Exit», WS_TABSTOP, 150,35,40,13,IDCANCEL

DlgStatic «Multithreading», SS_LEFT, 5,5,60,9,100

Β· Π’Ρ‹Π·ΠΎΠ² ΠΎΠΊΠ½Π° происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CallModalDialog: CallModalDialog hInstance, 0, DlgProc, NULL

Π“Π΄Π΅ DlgProc — функция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

1.4 ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Под процСссом Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, создаваСмый ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой Windows ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ исполняСмого модуля ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π² Π΅Π΄ΠΈΠ½ΠΎΠ»ΠΈΡ‡Π½ΠΎΠ΅ пользованиС:

1. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ для Π½Π΅Π³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой.

2. ДСскрипторы ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ².

3. Бписок Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌ Π² Π΅Π³ΠΎ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ динамичСских ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ (DLL).

4. Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, исполняСмыС нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, Π² ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΠΎΠΉ памяти процСсса.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‡Ρ‚ΠΎ касаСтся подпроцСсса. Бмысл Π΅Π³ΠΎ достаточно прост: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс Π² ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠΌ для Π½Π΅Π³ΠΎ адрСсном пространствС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ процСссы. Π­Ρ‚ΠΈ процСссы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΈ ΠΎΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ°. Однако ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ «ΡƒΠ±ΠΈΡ‚ΡŒ» любой ΠΈΠ· ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΈΠΌ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠ². Π’Π°ΠΊΠΈΠ΅ процСссы Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΅Ρ‰Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ нитями. Однако Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Windows для создания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ срСдства, Ρ€Π΅Ρ‡ΡŒ ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π½ΠΈΠΆΠ΅.

Π’Π°ΡˆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ процСссы, запустив Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Π•Π₯Π•-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСзависимо ΠΎΡ‚ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ прилоТСния. ΠžΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π’Π°ΡˆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈ нСобходимости ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ΅ ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠ°ΠΌΡΡ‚ΠΈ. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ процСсс) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateProcess. БСйчас ΠΌΡ‹ Π΄Π°Π΄ΠΈΠΌ описаниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НиТС ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Β· 1-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ — ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΈΠΌΡ запускаСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Имя ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Β· 2-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ — Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ NULL (0) ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ трактуСтся ΠΊΠ°ΠΊ командная строка запуска (Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹). Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ NULL, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ рассматриваСтся ΠΊΠ°ΠΊ командная строка, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ прСдставляСт собой имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ Ρ„ункция CreateProcess осущСствляСт поиск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ:

1. Поиск Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π±Ρ‹Π»Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

2. Поиск Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

3. Поиск Π² ΡΠΈΡΡ‚Π΅ΠΌΠ½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· GetSystemDirectory). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ систСмным ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ являСтся C: WINDOWSSYSTEM.

4. Поиск Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Windows (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· GetWindowsDirectory). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ этим ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ являСтся C: WINDOWS.

5. Поиск Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, пСрСчислСнных Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ PATH окруТСния.

Β· 3-ΠΉ ΠΈ 4-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для задания Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² доступа ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ процСсса. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ Ρ€Π°Π²Π½Ρ‹ΠΌ 0.

Β· 5-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Если этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 0, Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹ΠΉ процСсс Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΠ΅Ρ‚ дСскрипторы ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹ΠΉ процСсс наслСдуСт дСскрипторы.

Β· 6-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠœΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ свойства ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ процСсса. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ ΡΠ²ΠΎΠΉΡΡ‚Π²Π° Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ ΡΠΈΠ»Ρƒ большого количСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΌΡ‹ ΠΎΡ‚сылаСм ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΡ… ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ справочным руководствам.

Β· 7-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ЯвляСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Π±ΡƒΡ„Π΅Ρ€, содСрТащий ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ срСды. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ 0, Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹ΠΉ процСсс наслСдуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ срСды ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса.

Β· 8-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π—Π°Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ устройство ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ процСсса. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ NULL, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹ΠΉ процСсс наслСдуСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ устройство ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса.

Β· 9-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ, которая содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠΊΠ½Π΅ создаваСмого процСсса. НиТС Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны поля этой структуры.

Β· 10-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ, Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запуск прилоТСния. Π’ΠΎΡ‚ эта структура:

Β· PROCINF STRUC

Β· hProcess DD?; дСскриптор созданного процСсса.

Β· hThread DD?; дСскриптор Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса.

Β· Idproc DD?; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ созданного процСсса.

Β· idThr DD?; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса.

PROCINF ENDS

ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ дСскриптора ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ дСскриптор ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ лишь Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΆΠ΅ являСтся глобальной Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ΠΎΠΉ. ΠŸΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ процСсса. Π£ Ρ‡ΠΈΡ‚атСля, я Π΄ΡƒΠΌΠ°ΡŽ, сразу Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ вопрос: Π° Ρ‡Π΅ΠΌ дСскриптор прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetModuleHandle, ΠΎΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ упомянутых Π²Π΅Π»ΠΈΡ‡ΠΈΠ½? ДСскриптор прилоТСния, ΠΈΠ»ΠΈ дСскриптор модуля Π΅ΡΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° локальная, Ρ‚. Π΅. Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, равная адрСсу Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ модуля Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ адрСсноС пространство. ДСскриптор модуля имССтся Ρƒ Π»ΡŽΠ±ΠΎΠ³ΠΎ модуля, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² Ρ‚ΠΎΠΌ числС ΠΈ Ρƒ ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… DLL-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ структуру, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ 9-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateProcess. Вотэтаструктура:

STARTUP STRUC

cb DD 0

lpReserved DD 0

lpDesktop DD 0

lpTitle DD 0

dwX DD 0

dwY DD 0

dwXSize DD 0

dwYSize DD 0

dwXCountChars DD 0

dwYCountChars DD 0

dwFillAttribute DD 0

dwFlags DD 0

wShowWindow DW 0

cbReserved2 DW 0

lpReserved2 DD 0

hStdInput DD 0

hStdOutput DD 0

hStdError DD 0

STARTUP ENDS

Π˜Ρ‚Π°ΠΊ, Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ смысл ΠΏΠΎΠ»Π΅ΠΉ этой структуры. cb — Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½ΠΎΠΉ структуры Π² Π±Π°ΠΉΡ‚Π°Ρ…. ЗаполняСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. lpReserved — Ρ€Π΅Π·Π΅Ρ€Π², Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ. lpDesktop — имя Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола (ΠΈ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ станции). Π˜ΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Windows NT. lpTitle — Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° для ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… своС ΠΎΠΊΠ½ΠΎ. Для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ 0. dwX — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° X Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π° ΠΎΠΊΠ½Π°. dwY — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Y Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π° ΠΎΠΊΠ½Π°. dwXSize — Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° ΠΏΠΎ X. dwYSize — Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° ΠΏΠΎ Y. dwXCountChars — Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° консоли ΠΏΠΎ X. dwYCountChars — Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° консоли ΠΏΠΎ Y. dwFillAttribute — Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ тСкста. Π˜ΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. dwFlags — Ρ„Π»Π°Π³ значСния ΠΏΠΎΠ»Π΅ΠΉ. Π’ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Ρ„Π»Π°Π³Π°.

Π’Π°Π±Π»ΠΈΡ†Π° 1.

ΠœΠ°ΠΊΡ€ΠΎ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π°

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы

Бмысл значСния

STARTF_USESHOWWINDOW

1h

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ dwShowWindow

STARTF_USESIZE

2h

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ dwXSize ΠΈ dwYSize

STARTF_USEPOSITI0N

4h

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ dwX ΠΈ dwY

STARTF_USECOUNTCHARS

8h

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ dwXCountChars ΠΈ dwYCountChars

STARTF_USEFILLATTR1BUTE

10h

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ dwFillAttribute

STARTF_FORCEONFEEDBACK

40h

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ курсора

STARTF_FORCEOFFFEEDBACK

80h

Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ курсора

STARTF_USESTDHANDLES

100h

Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ hStdInput

wShowWindow — опрСдСляСт способ отобраТСния ΠΎΠΊΠ½Π°. cbReserved2 — Ρ€Π΅Π·Π΅Ρ€Π², Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ 0. hStdInput — дСскриптор Π²Π²ΠΎΠ΄Π° (для консоли). hStdOutput — дСскриптор Π²Ρ‹Π²ΠΎΠ΄Π° (для консоли). hStdError — дСскриптор Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ (для консоли).

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateThread. Рассмотрим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Β· 1-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² доступа. Π˜ΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Windows NT. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ полагаСтся NULL.

Β· 2-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π Π°Π·ΠΌΠ΅Ρ€ стСка ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ Π±Π΅Ρ€Π΅Ρ‚ся Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ€Π°Π²Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ стСка Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Β· 3-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, с Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ начинаСтся исполнСниС ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Β· 4-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Β· 5-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π€Π»Π°Π³, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ состояниС ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если Ρ„Π»Π°Π³ Ρ€Π°Π²Π΅Π½ 0, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° начинаСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ€Π°Π²Π½ΠΎ CREATE_SUSPENDED (4H), Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ находится Π² ΡΠΎΡΡ‚ояниС оТидания ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся ΠΏΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ResumeThread.

Β· 6-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ дСскриптор ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° начинаСтся с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΅ΡΡ‚СствСнному ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΠΎΡ‚ΠΎΠΊ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ExitThread с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° Π²Ρ‹Ρ…ΠΎΠ΄Π°. НаконСц, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TerminateThread

Π’ΠΎΠΎΠ±Ρ‰Π΅ идСальной ΠΌΠ½Π΅ каТСтся ситуация, ΠΊΠΎΠ³Π΄Π° функция ΠΎΠΊΠ½Π° Π±Π΅Ρ€Π΅Ρ‚ Π½Π° ΡΠ΅Π±Ρ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° ΡΠΎΠ±Ρ‹Ρ‚ия, происходящиС с ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π° Π²ΡΡŽ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ (слоТныС вычислСния, файловая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π·ΡΡ‚ΡŒ Π½Π° ΡΠ΅Π±Ρ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ.

Для взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ:

1. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹

2. Бобытия

3. ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ сСкции

4. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

5. БообщСния Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ прСдставляСт собой Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссов ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Для программиста сСмафор — это просто счСтчик. Если счСтчик Ρ€Π°Π²Π΅Π½ N, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊ Ρ€Π΅ΡΡƒΡ€ΡΡƒ ΠΈΠΌΠ΅ΡŽΡ‚ доступ N ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠ².

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateSemaphore создаСтся сСмафор ΠΈ Π΅Π³ΠΎ дСскриптор присваиваСтся глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ обращСния ΠΊ Ρ€Π΅ΡΡƒΡ€ΡΠ°ΠΌ, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForSingleObject. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ доступа функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π΅ΡΡƒΡ€ΡΠΎΠΌ слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ReleaseSemaphore. Π’Π΅ΠΌ самым увСличиваСтся счСтчик доступа Π½Π° 1. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСмафора ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Ρ€Π΅ΡΡƒΡ€ΡΡƒ. МаксимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚, сколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Ρ€Π΅ΡΡƒΡ€ΡΡƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Бобытия. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€, Π½ΠΎ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

CreateEvent — создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-событиС. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. 1-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π˜ΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ смысл, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateSemaphore. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ полагаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ NULL. 2-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ResetEvent. Π˜Π½Π°Ρ‡Π΅ событиС сбрасываСтся ΠΏΡ€ΠΈ доступС ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π»ΠΈΠ±ΠΎ процСсса. 3-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ 0, Ρ‚ΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ инициализируСтся ΠΊΠ°ΠΊ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ΅, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС сразу ΠΆΠ΅ подаСтся сигнал ΠΎ Π½Π°ΡΡ‚ΡƒΠΏΠ»Π΅Π½ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ситуации. 4-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ, которая содСрТит имя события.

ОТиданиС события осущСствляСтся, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ с ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€ΠΎΠΌ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ WaitForSingleObject.

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ сСкции. ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ критичСской сСкции позволяСт ΡƒΠ±Π΅Ρ€Π΅Ρ‡ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ области ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΡΡ‚ΠΎΠΉ области ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнялся Π±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. Рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΡ€ΠΈΡ‚ичСской сСкциСй.

InitializeCriticalSection — данная функция создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ критичСская сСкция. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Β· 1-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π½ΠΈΠΆΠ΅. Поля Π΄Π°Π½Π½ΠΎΠΉ структуры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ, ΠΈ ΡΠΌΡ‹ΡΠ» ΠΈΡ… Π±Π΅Π·Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½.

Β· CRITICAL_SECTION STRUCT

Β· DebugInfo DWORD ?

Β· LockCount LONG ?

Β· RecursionCount LONG ?

Β· OwningThread HANDLE ?

Β· LockSemaphore HANDLE ?

Β· SpinCount DWORD ?

CRITICAL_SECTION ENDS

EnterCriticalSection — Π²ΠΎΠΉΡ‚ΠΈ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ. ПослС выполнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ становится Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Π΄Π°Π½Π½ΠΎΠΉ сСкции. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Π²Π°Π² Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΡΠΎΡΡ‚оянии оТидания. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

LeaveCriticalSection — ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ. ПослС этого Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» остановлСн Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ EnterCriticalSection, станСт Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ критичСской сСкции. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LeaveCriticalSection Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

DeleteCriticalSection — ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ «ΠΊΡ€ΠΈΡ‚ичСская сСкция». ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² критичСской сСкции, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π”Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, выводящСй ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ ΠΈΠ· ΡΡ‚Ρ€ΠΎΠΊΠΈ Π² ΠΎΠΊΠ½ΠΎ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠΉ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π° строка.

Π§Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, выводящСй ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ символ, сдСлана критичСской, поэтому доступ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π² ΠΎΠΊΠ½ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.

windows ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ассСмблСр

2. ДСмонстрационная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

2.1 Листинг

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««

.486 ;

.model flat, stdcall ;

optioncasemap :none ;

; ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ„Π°ΠΉΠ»Ρ‹

; ~~~~~~~~~~~~~

include .includewindows.inc

include .includeuser32.inc

include .includekernel32.inc

include .macrosmacros.asm

include .includemasm32.inc

; Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

; ~~~~~~~~~

includelib .libuser32.lib

includelib .libkernel32.lib

includelib .libmasm32.lib

include .includedialogs.inc

; ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ²

DlgProcPROTO :DWORD:DWORD:DWORD:DWORD

rotate_caption PROTO: DWORD

; ДатасСгмСнт

.data

textBufferOSdb «ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ² Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎ», 0

progdb «c:windowsregedit.exe», 0

processInfo PROCESS_INFORMATION <>

.data?

hWnddd ?

hhwn dd ?

hInstancedd ?

ThreadIDDWORD ?

threadSwitchdd ?

threadCountdd ?

textBufferdb 20 dup (?)

startInfodd ?

; ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹

.const

IDSTOP equ 102

IDPROC equ 103

WM_STOP_THREAD equ WM_USER+1

; «„„„„„„„„„„„„„„„„„„„„„„„„„„ΠšΠžΠ”““““““““““““““““““““““““““»""

.code

start:

movhInstance, FUNC (GetModuleHandle, NULL)

;ΠžΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌΠ΄ΠΈΠ°Π»ΠΎΠ³

Dialog «Scrolling text multithreading «, ;Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ

" MSSansSerif", 10,; Π¨Ρ€ΠΈΡ„Ρ‚ ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€

WS_OVERLAPPED or; Π‘Ρ‚ΠΈΠ»ΡŒ

WS_SYSMENU or DS_CENTER,; Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎΠΎΠΊΠ½Π°

4,; Число элСмСнтов управляСния

50,50,200,100, ;xy ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

1024; Π Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Ρ„Π΅Ρ€Π°

;ΠžΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ

DlgButton «Runthread», WS_TABSTOP, 150,5,40,13,IDOK

DlgButton «Shut off», WS_TABSTOP, 150,20,40,13,IDSTOP

DlgButton «Start regedit», WS_TABSTOP, 150,35,40,13,IDPROC

DlgButton «Exit», WS_TABSTOP, 150,50,40,13,IDCANCEL

;ВСкствнутри

DlgStatic «Multithreading «, SS_LEFT, 5,5,60,9,100

;Π’Ρ‹Π·ΠΎΠ²ΠΎΠΊΠ½Π°

CallModalDialog hInstance, 0, DlgProc, NULL

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎΠΎΠΊΠ½Π°

DlgProcprochWin:DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD

;РазборсообщСния

Switch uMsg

Case WM_INITDIALOG ;насоздании

m2mhWnd, hWin; копируСмдСскриптор

movthreadCount, 0 ;счСтчикпотоков = 0

CaseWM_COMMAND; Ρ€Π°Π·Π±ΠΎΡ€ сообщСний ΠΊΠ½ΠΎΠΏΠΎΠΊ

SwitchwParam

CaseIDOK

movthreadSwitch, 0; маска для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

;Если = 0 Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π°

moveax, OFFSETthread_proc1; Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ адрСс ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ°

invokeCreateThread, NULL, NULL, eax, NULL, NULL, ADDRThreadID; Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΏΠΎΡ‚ΠΎΠΊ

Case IDCANCEL ;

jmpquit_dialog; Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒΠ΄ΠΈΠ°Π»ΠΎΠ³

Case IDSTOP ;остановкапотоков

moveax, OFFSET thread_proc2; Π²Ρ‹Π·ΠΎΠ²Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΈΠ΄Π°ΠΏΠΎΡ‚ΠΎΠΊΠ°

invokeCreateThread, NULL, NULL, eax, NULL, NULL, ADDRThreadID

Case IDPROC ;созданиСпроцСсса

invokeGetStartupInfo, ADDRstartInfo; ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ

;Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ процСсс

invoke CreateProcess, NULL, offsetprog, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, ADDRstartInfo, ADDRprocessInfo

EndSw

CaseWM_STOP_THREAD

movthreadSwitch, 1; ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ маска для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² = 1

Case WM_CLOSE

quit_dialog:

invoke EndDialog, hWin, 0; Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠ΄ΠΈΠ°Π»ΠΎΠ³

EndSw

return 0

DlgProcendp

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

; ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ (ΡΠΊΡ€ΠΎΠ»Π»ΠΈΡ‚ΡŒ) Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ

thread_proc1proc

;Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

LOCAL tlen: DWORD

LOCAL buffer[128]: BYTE

Local pbuf: DWORD

Local charCount: DWORD

mov charCount, 0

movpbuf, ptr$(buffer)

addthreadCount, 1

@loop:

invoke GetWindowText, hWnd, pbuf, 128; бСрСмтСкст

invokerotate_caption, pbuf;ΠΊΡ€ΡƒΡ‚ΠΈΠΌΠ½Π° 1 символ

invokeSetWindowText, hWnd, pbuf;обновляСмтСкст

invoke Sleep, 50;Π·Π°Π΄Π΄Π΅Ρ€ΠΆΠΊΠ°

.if threadSwitch == 1;СслизапрСт

jmp @stopThread;Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°

.endif

jmp @loop

@stopThread:

ret

thread_proc1endp

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

thread_proc2proc

invokedwtoa, threadCount, ADDRtextBuffer; число Π² ΡΡ‚Ρ€ΠΎΠΊΡƒ

invokeMessageBox, hWnd, ADDRtextBuffer, ADDRtextBufferOS, MB_OK; Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎ

invokeSendMessage, hWnd, WM_STOP_THREAD, NULL, NULL; отсылаСм сообщСниС

mov threadCount, 0; сбрасываСм счСтчик

ret

thread_proc2endp

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

OPTION PROLOGUE: NONE

OPTIONEPILOGUE:NONE

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Π½Π° 1 символ

rotate_captionprocpbuf:DWORD

movedx, [esp+4]; Π³Ρ€ΡƒΠ·ΠΈΠΌ строку

movcl, [edx]; ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚

addedx, 1; ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ

@rewrite:

moval, [edx]; Ρ‡ΠΈΡ‚Π°Π΅ΠΌ символ

addedx, 1; ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс

testal, al; провСряСм Π½Π° 0

jz @last_rewrite; Ссли ΠΊΠΎΠ½Π΅Ρ† строки Ρ‚ΠΎ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄

mov [edx-2], al; запись символа

jmp @rewrite

@last_rewrite:

mov [edx-2], cl; запись послСднСго символа

movBYTEPTR [edx-1], 0; Π½ΡƒΠ»ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€

ret 4; балансстСка

rotate_captionendp

OPTION PROLOGUE: PrologueDef

OPTION EPILOGUE: EpilogueDef

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

2.2 ДСмонстрация Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’Ρ‹Π²ΠΎΠ΄ Π’ Ρ…ΠΎΠ΄Π΅ Π΄Π°Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ освСщСны основы программирования для WINDOWS. Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΡΡ€Π΅Π΄ΡΡ‚Π²Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ программирования Π²WINDOWS. Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π±Ρ‹Π» использован 32-Π±ΠΈΡ‚Π½Ρ‹ΠΉ ассСмблСр.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ