ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

API взаимодСйствия клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с сСрвСром Π‘Π£Π‘Π”

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

ΠžΠ±Ρ‰ΠΈΠ΅ понятия Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Microsoft Windows для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°Π½Π°Π»Ρ‹ PIPE. Π­Ρ‚ΠΎ срСдство позволяСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ процСссами, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… станциях Π² ΡΠ΅Ρ‚ΠΈ. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ разновидности ΠΊΠ°Π½Π°Π»ΠΎΠ² Pipe — ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ (Named Pipes) ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ (Anonymous Pipes). Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

API взаимодСйствия клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с сСрвСром Π‘Π£Π‘Π” (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

[Type text][Type text][Type text]

Π‘ΠžΠ”Π•Π Π–ΠΠΠ˜Π• ИсслСдованиС ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ ОписаниС SQLite

Устройство ΠΈ Ρ…арактСристики Π‘Π£Π‘Π” SQLite

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ОписаниС PIPE ΠΏΠΎΠ΄ Windows

ΠžΠ±Ρ‰ΠΈΠ΅ понятия

Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ WinAPI для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ЗамысСл тСхничСского Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ РСализация взаимодСйствия Ρ‡Π΅Ρ€Π΅Π· PIPE

ИсполнСниС запросов ΠΊ SQLite

ОписаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π‘Π΅Ρ€Π²Π΅Ρ€ ΠšΠ»ΠΈΠ΅Π½Ρ‚

API

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1. CppNamedPipeServer. cpp

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2. CppNamedPipeClient. cpp

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 3. SQLite_API.h

ИсслСдованиС ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ Π‘Π£Π‘Π” SQLite являСтся лСгковСсной встраиваСмой, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния Π±Π΅Π· использования сСрвСра Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ Π‘Π£Π‘Π” находится Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΌ доступС. Доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² Π±Π°Π·Π΅ происходит Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² соотвСтствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DLL.

Для взаимодСйствия прилоТСния с Π‘Π£Π‘Π” SQLite Π² Π½Π°ΡΡ‚оящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ интСрфСйсы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ встроСнный интСрфСйс SQLite, JDBC, ODBC ΠΈ Ρ‚. ΠΏ. Однако, Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ взаимодСйствиС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ Π‘Π£Π‘Π” ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Pipe ΠΏΠΎΠ΄ Windows.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ†Π΅Π»ΡŒΡŽ курсового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° являСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° API взаимодСйствия клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ? с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ Π‘Π£Π‘Π” Ρ‡Π΅Ρ€Π΅Π· Pipe ΠΏΠΎΠ΄ Windows.

Учитывая спСцифику Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π‘Π£Π‘Π” ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Pipe, приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ…Π·Π²Π΅Π½Π½ΡƒΡŽ модСль взаимодСйствия клиСнтского прилоТСния с Π‘Π£Π‘Π”. Π’ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ запрос ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ского прилоТСния поступаСт Π² ΡΠ΅Ρ€Π²ΠΈΡ срСднСго Π·Π²Π΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π² запрос, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Π‘Π£Π‘Π” SQLite. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ обрабатываСтся сСрвисом срСднСго Π·Π²Π΅Π½Π°, послС Ρ‡Π΅Π³ΠΎ пСрСдаСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

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

Π Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΌ Π·Π²Π΅Π½ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ским ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΡΡ‡Π΅Ρ‚ использования PIPE. Π”Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСгда Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ ΠΈ ΠΆΠ΄Π΅Ρ‚ получСния запроса ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· PIPE.

Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ прСимущСства Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ контроля доступа ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ввСсти ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π΄Π°Π½Π½Ρ‹Ρ…. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ прСимущСством Ρ‚Ρ€Π΅Ρ…Π·Π²Π΅Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π‘Π” Π·Π° ΡΡ‡Π΅Ρ‚ ввСдСния собствСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

ОписаниС SQLite

Устройство ΠΈ Ρ…арактСристики Π‘Π£Π‘Π” SQLite

Π‘Π£Π‘Π” SQLite являСтся встраиваСмой рСляционной Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. SQLite Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ SQLite Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ процСссом, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ взаимодСйствуСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компонуСтся ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ становится составной Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΎΠ±ΠΌΠ΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (API) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ SQLite. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

SQlite ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ тСстируСтся ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ выпуском Π½ΠΎΠ²ΠΎΠΉ вСрсии. Данная Π‘Π£Π‘Π” устойчива ΠΊ «ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти» ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°ΠΌ дискового Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

SQLite доступна Π² ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠΎΠ΄Π°Ρ… (Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ C), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ DLL ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

Доступ ΠΊ Π‘Π” происходит Ρ‡Π΅Ρ€Π΅Π· «ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ» ΠΊ Π‘Π”, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ открываСтся Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DLL. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ указываСтся имя Ρ„Π°ΠΉΠ»Π° Π‘Π”. Если Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚Ρƒ — ΠΎΠ½ Π°Π²Ρ‚оматичСски создаСтся.

Допустимо ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ мноТСство ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΆΠ΅ Π‘Π” (Ρ‡Π΅Ρ€Π΅Π· имя Ρ„Π°ΠΉΠ»Π°) Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… прилоТСниях. БистСма ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠžΠ‘.

SQLite ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ собрана Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ компиляции SQLITE_THREADSAFE = 0). Π’ ΡΡ‚ΠΎΠΌ случаС нСльзя ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ отсутствуСт ΠΊΠΎΠ΄ синхронизации. Однако, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π° ΡΡ‡Π΅Ρ‚ экономии Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… синхронизации.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² sqlite3_threadsafe (): Ссли Π²Π΅Ρ€Π½ΡƒΠ»Π° 0, Ρ‚ΠΎ ΡΡ‚ΠΎ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ SQLite.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, SQLite собран с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (sqlite3.dll).

Π•ΡΡ‚ΡŒ Π΄Π²Π° способа использования ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ SQLite: serialized ΠΈ multi-thread.

Serialized (Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ SQLITE_OPEN_FULLMUTEX ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ соСдинСния). Π’ ΡΡ‚ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π΄Π΅Ρ€Π³Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ SQLite, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Но Π²ΡΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ строго ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Multi-thread (SQLITE_OPEN_NOMUTEX). Π’ ΡΡ‚ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ соСдинСниС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π½ΠΎ Π΄ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ использованиС Ρ€Π°Π·Π½Ρ‹Ρ… соСдинСний Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ этот Ρ€Π΅ΠΆΠΈΠΌ.

Π’Π°ΠΆΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ SQLite являСтся «Π°Ρ‚омарная транзакция». Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ всС измСнСния Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π²ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² ΡΠΈΠ»Ρƒ, Π»ΠΈΠ±ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚. Π’Π°ΠΊ ΠΊΠ°ΠΊ, ΠΈΠ·-Π·Π° физичСских ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, нСльзя ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ запись Π² Ρ€Π°Π·Π½Ρ‹Π΅ участки Ρ„Π°ΠΉΠ»Π°, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ создаСт иллюзияю, Ρ‡Ρ‚ΠΎ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, относящиСся Π² Ρ€Π°Π·Π½Ρ‹Π΅ участки Ρ„Π°ΠΉΠ»Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… происходят ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ возникновСния сбоя, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ питания ΠΈΠ»ΠΈ сбоСм систСмы, Π‘Π£Π‘Π” SQLite способна Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ состояниС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Для взаимодСйствия с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… SQLite ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ стандартный Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, описанных Π² Windows DLL Ρ„Π°ΠΉΠ»Π΅, поставляСмом с Π‘Π”. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ framework ΠΈ ΡΠ·Ρ‹ΠΊ программирования.

Основной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π‘Π£Π‘Π” SQLite являСтся ΠΎΡ†Π΅Π½ΠΊΠ° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ SQL запроса. Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π‘Π£Π‘Π” Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ трСбуСтся ΠΈΠΌΠ΅Ρ‚ΡŒ 2 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ соСдинСния (database connection object);

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° (prepared statement object).

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСбольшим Π½Π°Π±ΠΎΡ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· C/C++ интСрфСйса:

sqlite3_open ();

sqlite3_prepare ();

sqlite3_step ();

sqlite3_column ();

sqlite3_finalize ();

sqlite3_close ().

Для исполнСния SQL выраТСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ sqlite3_prepare ().

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ sqlite3_step (), ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ€Π°Π·.

Для запросов ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ sqlite3_column () ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ sqlite3_step ().

Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° sqlite3_finalize ().

Ѐункция sqlite3_exec () являСтся Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ€Π°Π½Π΅Π΅ 4 шага ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ПослС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вызываСтся callback функция, которая ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса.

Π’Π°ΠΊΠΆΠ΅ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ SQLite Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, которая позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ SQL запросы.

ОписаниС PIPE под Windows

ΠžΠ±Ρ‰ΠΈΠ΅ понятия Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Microsoft Windows для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°Π½Π°Π»Ρ‹ PIPE. Π­Ρ‚ΠΎ срСдство позволяСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ процСссами, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… станциях Π² ΡΠ΅Ρ‚ΠΈ. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ разновидности ΠΊΠ°Π½Π°Π»ΠΎΠ² Pipe — ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ (Named Pipes) ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ (Anonymous Pipes). Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ ΠΏΡ€ΠΈ создании присваиваСтся имя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ доступно для Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов. Зная имя ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ станции Π² ΡΠ΅Ρ‚ΠΈ, процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠ°Π½Π°Π»Ρƒ, созданному Π½Π° ΡΡ‚ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ станции. АнонимныС ΠΊΠ°Π½Π°Π»Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ процСссами, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ станции ΠΈΠ»ΠΈ Π½Π° «ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоящСм» ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

Π§Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя процСссами. Один ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠ² создаСт ΠΊΠ°Π½Π°Π», Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ. ПослС этого ΠΎΠ±Π° процСсса ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π» Π² ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ ΠΎΠ±Π΅ стороны. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π°Π΄ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ Pipe синхронныС ΠΈΠ»ΠΈ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ использования асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ доступа.

Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹

Named Pipe прСдставляСт собой ΠΊΠ°Π½Π°Π» для взаимодСйствия ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСрвСра ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»Π°. ВсС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ, Π½Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ свои Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹, ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» для связи ΠΊΠ»ΠΈΠ΅Π½Ρ‚ — сСрвСр. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСскольким ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ°Π½Π°Π». Если ΠΎΠ΄ΠΈΠ½ сСрвСрный процСсс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΊΠ°Π½Π°Π»Π° для связи с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΠΌΠΈ клиСнсткими, Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ количСство Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мСньшС, Ρ‡Π΅ΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ максимальноС количСство ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠΆΠ΅Π»Π°ΡŽΡ‚ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с ΡΠ΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΌ процСссом всС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Π‘Π°ΠΌΡ‹ΠΌ просты для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ являСтся ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ сСрвСр ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссС ΠΈΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, соотвСтствСнно, достаточно ΠΎΠ΄Π½ΠΎΠ³ΠΎ прСдставлСния Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. На ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс систСмы выдСляСт процСссорноС врСмя ΠΊΠΎΠ³Π΄Π° это трСбуСтся. Однако ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС систСмных рСсурсов, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ ΠΏΡ€ΠΈ большом числС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ постоянно, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ pipe Π² Unix, Π±Ρ‹Ρ‚ΡŒ созданы ΠΊΠ°ΠΊ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π’ ΠžΠ‘ Windows ΠΈΠΌΠ΅ΡŽΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Ρ‹ самой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой послС закрытия послСднСй ссылки Π½Π° ΠΊΠ°Π½Π°Π».

ИмСна ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

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

Для обСспСчСния контроля доступа ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ создании ΠΊΠ°Π½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ дСскриптор бСзопасности. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠ³ΠΎ дСскриптора ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ прилоТСния Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ дСскриптора ΠΊΠ°ΠΊ NULL ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° бСзопасности, заданная Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ WinAPI для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»ΠΎΠΌ.

Канал Pipe ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π»ΠΈΠ±ΠΎ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚, Π»ΠΈΠ±ΠΎ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сообщСний. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π» ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π±Π°ΠΉΡ‚Π°ΠΌ, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ — ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈ создании ΠΊΠ°Π½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°Π½Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для чтСния, записи ΠΈΠ»ΠΈ для чтСния ΠΈ Π·Π°ΠΏΠΈΡΠΈ.

Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΊΠ°Π½Π°Π»Π°, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ / запись. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ состояниС Π³ΠΎΠ½ΠΊΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½Π΅ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

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

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

Для осущСствлСния мСТпроцСссного взаимодСйствия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WinAPI ΠΊΠ°ΠΊ:

Для создания ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π» вызываСтся функция CreateNamedPipe:

HANDLE WINAPI CreateNamedPipe (

_In_ LPCTSTR lpName,

_In_ DWORD dwOpenMode,

_In_ DWORD dwPipeMode,

_In_ DWORD nMaxInstances,

_In_ DWORD nOutBufferSize,

_In_ DWORD nInBufferSize,

_In_ DWORD nDefaultTimeOut,

_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

Для оТидания ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ вызываСтся функция ConnectNamedPipe:

BOOL WINAPI ConnectNamedPipe (

_In_ HANDLE hNamedPipe,

_Inout_opt_ LPOVERLAPPED lpOverlapped

);

Для записи ΠΊΠ°Π½Π°Π» инициализируСтся ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ„Π°Π»Ρƒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция CreateFile:

HANDLE WINAPI CreateFile (

LPCTSTR lpFileName,

_In_ DWORD dwDesiredAccess,

_In_ DWORD dwShareMode,

_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,

_In_ DWORD dwCreationDisposition,

_In_ DWORD dwFlagsAndAttributes,

_In_opt_ HANDLE hTemplateFile

);

Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠ°Π½Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция WriteFile:

BOOL WINAPI WriteFile (

_In_ HANDLE hFile,

_In_ LPCVOID lpBuffer,

_In_ DWORD nNumberOfBytesToWrite,

_Out_opt_ LPDWORD lpNumberOfBytesWritten,

_Inout_opt_ LPOVERLAPPED lpOverlapped

);

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° производится Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ReadFile:

BOOL WINAPI ReadFile (

_In_ HANDLE hFile,

_Out_ LPVOID lpBuffer,

_In_ DWORD nNumberOfBytesToRead,

_Out_opt_ LPDWORD lpNumberOfBytesRead,

_Inout_opt_ LPOVERLAPPED lpOverlapped

);

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° производится Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CloseHandle:

BOOL WINAPI CloseHandle (

_In_ HANDLE hObject

);

ЗамысСл тСхничСского Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π—Π°Π΄Π°Ρ‡Π° ΠΏΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ клиСнтского API ΠΊ Π‘Π£Π‘Π” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PIPE ΠΏΠΎΠ΄ Windows сводится ΠΊ 2 основным этапам:

РСализация ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного API для взаимодСйствия ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ PIPE;

ИсполнСниС запроса ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ Π‘Π£Π‘Π”.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ SQL ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Insert, Update, Delete ΠΈ Ρ‚. ΠΏ. ПослС исполнСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, Π»ΠΈΠ±ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.

РСализация взаимодСйствия Ρ‡Π΅Ρ€Π΅Π· PIPE

БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΊΠ°Π½Π°Π»ΠΎΠ²: ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅. АнонимныС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ нСзависимыС сСрвСр ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚авляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ SQL запроса с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ского прилоТСния Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€, Π³Π΄Π΅ находится Π‘Π£Π‘Π” SQLite, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ взаимодСйствия ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ². ΠŸΡ€ΠΈ запускС сСрвСра создаСтся ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π». ПослС ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡŽ ΠΊΠ°Π½Π°Π»Π° клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ связываСтся с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ Π’Π°ΠΊ ΠΊΠ°ΠΊ с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ взаимодСйствуСт нСсколько клиСнтских ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² ΠΊΠ°Π½Π°Π»Π΅. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ клиСнтского прилоТСния.

Π‘Π΅Ρ€Π²Π΅Ρ€ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° создаСтся свой ΠΏΠΎΡ‚ΠΎΠΊΠΈ вся Ρ€Π°Π±ΠΎΡ‚Π° происходит Π² ΡΡ‚ΠΎΠΌ контСкстС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ исчСзаСт Π·Π°Π΄Π°Ρ‡Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ клиСнтского прилоТСния Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ хранятся Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΈ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ прСдставляСт собой консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ Π½Π΅ΠΌ происходит Π²Π²ΠΎΠ΄ SQL запроса ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ, Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π°, ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π°.

Для взаимодСйствия клиСнтского ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ прилоТСния Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ;

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° строки запроса, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ском ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ;

ΠŸΡ€ΠΈΠ΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π° ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исполнСния ΠΈΠ»ΠΈ ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΡˆΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…;

ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π°.

ИсполнСниС запросов ΠΊ SQLite

Π’ΠΎ Π²Ρ€Π΅ΠΌΡ запуска сСрвСра происходит ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π‘Π£Π‘Π”. ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ создаСтся дСскриптор ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π·Π° ΡΡ‡Π΅Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ выполнятся всС запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π°ΠΊ ΠΊΠ°ΠΊ сСрвСр ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ, дСскриптор ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ доступСн всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. Бинхронизация доступа ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π‘Π£Π‘Π” SQLite, поэтому достаточно ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

ПослС исполнСния запроса проводится ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²ΠΎΠ·Π½ΠΈΠΊΡˆΠΈΠ΅ ошибки. Если ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка, Ρ‚ΠΎ ΠΈΠ½Ρ„ормация ΠΎ Π½Π΅ΠΉ пСрСдаСтся Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π° Π‘Π£Π‘Π” Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Π²Π½ΠΎΡΠΈΡ‚.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ пСрСдаСтся ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, Π° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ.

ОписаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π‘Π΅Ρ€Π²Π΅Ρ€ Бтруктурная схСма сСрвСра прСдставлСна Π½Π° «Ρ€ΠΈΡ.1». Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ сСрвСра прСдставлСн Π½Π° «Ρ€ΠΈΡ.2».

ΠŸΡ€ΠΈ запускС сСрвСра создаСтся ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» с ΠΈΠΌΠ΅Π½Π΅ΠΌ \.\pipe\SamplePipe. Канал открываСтся для чтСния ΠΈ Π·Π°ΠΏΠΈΡΠΈ. Π Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний. Π‘ΡƒΡ„Π΅Ρ€Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² 512 Π±Π°ΠΉΡ‚.

Рис. 1. Бтруктурная схСма сСрвСра ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ создания ΠΊΠ°Π½Π°Π»Π° происходит ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sqlite3_open (). Π Π°Π±ΠΎΡ‚Π° вСдСтся с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… my1_database.dblite. Если Π΅Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ»Π°, Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ‚ся новая пустая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС открываСтся ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ сСрвСр ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ, дСскриптор ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄ΠΈΠ½. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для всСх ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² сущСствуСт ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Если всС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ шаги Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, сСрвСр ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ПослС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ создаСтся ΠΏΠΎΡ‚ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. А ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π‘Π»ΠΎΠΊ-схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° прСдставлСна Π½Π° «Ρ€ΠΈΡ.3». Π’ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ происходит Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ входящСй строки. Для этого вызываСтся функция ReadFile (). Если Π²ΠΎ Π²Ρ€Π΅ΠΌΡ чтСния Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ошибок, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ся функция void GetAnswerToRequest (wchar_t* pchRequest, LPTSTR pchReply, LPDWORD pchBytes). Π‘Π»ΠΎΠΊ-схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetAnswerToRequest прСдставлСна Π½Π° Ρ€ΠΈΡ. 4.

Π’Π°ΠΊ ΠΊΠ°ΠΊ API SQLite Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со ΡΡ‚Ρ€ΠΎΠΊΠ°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° char, Π° ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с PIPE строки Ρ‚ΠΈΠΏΠ° wchar_t. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ SQL запроса происходит ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΊ char. ПослС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ запроса ΠΈ Π΅Π³ΠΎ исполнСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ пСрСдаСтся Π»ΠΈΠ±ΠΎ строка с ΠΎΡˆΠΈΠ±ΠΊΠΎΠΉ, Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π²Π΅Ρ‚, Ρ‡Ρ‚ΠΎ запрос исполнСн ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Рис. 2. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСрного прилоТСния послС запуска Рис. 3. Бтруктурная схСма ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ клиСнтскоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сСрвСр Рис. 4. Бтруктурная схСма Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetAnswerToRequest

ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запуска ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° прСдставлСн Π½Π° «Ρ€ΠΈΡ.5». Π•Π³ΠΎ структурная схСма ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° прСдставлСна Π½Π° «Ρ€ΠΈΡ.6».

Основной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ клиСнтского прилоТСния являСтся дСмонстрация возмоТностСй Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ API. Для этого создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ server, конструкотору ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСдаСтся имя ΠΊΠ°Π½Π°Π»Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ.

Рис. 5. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ клиСнтского прилоТСния послС запуска Рис. 6. Бтруктурная схСма клиСнтского прилоТСния Π˜ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ запрос ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. ПослС наТатия клавиши Enter ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° запроса Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€, Π΅Π³ΠΎ исполнСниС ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

ПослС исполнСния запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

API

Для взаимодСйствия с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ класс Pipe_SERVER, исходный ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ находится Π² Ρ„Π°ΠΉΠ»Π΅ «SQLite_API.h» ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² API:

int connect () — функция для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ссли ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ошибки происходит Π²Ρ‹Π²ΠΎΠ΄ тСкста ошибки ΠΈ Ρ„ункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1.

int send_data (wchar_t *chRequest, int length) — функция для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ строки запроса chRequest Π΄Π»ΠΈΠ½ΠΎΠΉ length. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. Π˜Π½Π°Ρ‡Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1 ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π°.

int recieve_data () — функция, прСдназначСнная для получСния ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π°. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π² ΡΠ»ΡƒΡ‡Π°Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ исполнСния. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ошибки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π°.

void cleanup () — функция для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π°.

Для использования функция API создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Pipe_SERVER, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ всС взаимодСйствиС.

Π’ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Π΅ класса происходит ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ настройка ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ инициализация ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»Π°.

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΡΠ΅Ρ€Π²Π΅Ρ€Ρƒ трСбуСтся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ connect (). Π’ ΡΡ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WinAPI CreateFile () происходит инициализация ΠΊΠ°Π½Π°Π»Π° Π½Π° ΡΡ‚ΠΎΡ€ΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ сохраняСтся HANDLE, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ происходит запись ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ сообщСний.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° send_data (wchar_t *chRequest, int length) производится ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° строки chRequest Π΄Π»ΠΈΠ½ΠΎΠΉ length Π±Π°ΠΉΡ‚. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° запроса выполняСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WriteFile ().

Для получСния ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ recieve_data (). Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReadFile () происходит Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ chResponse, ΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ глобальной Π² ΠΊΠ»Π°ΡΡΠ΅. ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ чтСния ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½ΠΎΠ΅ сообщСниС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ chResponse ΠΈΠ· ΠΊΠΎΠ΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° cleanup () производится ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΡΠ΅Ρ€Π²Π΅Ρ€Π°, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CloseHandle (). ПослС закрытия соСдинСния вся Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

Π—Π°Π½ΠΎΠ²ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ соСдинСния, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ connect (). ΠžΠ±ΡŠΠ΅ΠΊΡ‚ нСльзя ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ сСрвСром.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ слСдуСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ использованиС Pipe Π½Π° ΠžΠ‘ Windows ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ЗасчСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Pipe ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ WinAPI, ΠΊΠ°ΠΊ ΠΈ Π΄Π»Ρ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сущСствСнно сокращаСтся.

Π’ Ρ…ΠΎΠ΄Π΅ выполнСния курсового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ интСрфСйс, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Pipe Π² ΠžΠ‘ Windows Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ взаимосвязь клиСнтского прилоТСния с ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ Π‘Π£Π‘Π”.

Π”Π°Π½Π½Ρ‹ΠΉ интСрфСйс Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ привязки ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π‘Π£Π‘Π” Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ пСрСдаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ SQL запрос. А ΡΠ°ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π‘Π£Π‘Π” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π° ΡΡ‚ΠΎΡ€ΠΎΠ½Π΅ сСрвСра. Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ любой интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π‘Π£Π‘Π”.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ API появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Π‘Π” Π½Π΅ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π° Π½Π° ΡΠ΅Ρ€Π²Π΅Ρ€Π΅ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ сСти. Для этого трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ имя ΠΊΠ°Π½Π°Π»Π°.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ API являСтся прослойкой ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ ΡΠ΅Ρ€Π²Π΅Ρ€ΠΎΠΌ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅Ρ‚ транспортныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ увСличСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π±Π΅Π· внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² API.

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Windows NT. — ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Ρ€ Π€Ρ€ΠΎΠ»ΠΎΠ², Π“Ρ€ΠΈΠ³ΠΎΡ€ΠΈΠΉ Ρ„Ρ€ΠΎΠ»ΠΎΠ². Π’ΠΎΠΌ 27, Ρ‡Π°ΡΡ‚ΡŒ 2. М.: Π”ΠΈΠ°Π»ΠΎΠ³-МИЀИ, 1996

БистСмы Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΠ»Π½Ρ‹ΠΈ? курс. — Π“арсиа-Молина Π“., Ульман Π”ΠΆ., Π£ΠΈΠ΄ΠΎΠΌ Π”ΠΆ. Π’ΠΈΠ»ΡŒΡΠΌΡ, 2003.-1088с.

C++ для профСссионалов. — ΠΠΈΠΊΠΎΠ»Π°Ρ А. Π‘ΠΎΠ»Ρ‚Π΅Ρ€, Майкл Π›. ΠšΠ»Π΅ΠΏΠ΅Ρ€. Π”ΠΈΠ°Π»Π΅ΠΊΡ‚ΠΈΠΊΠ°, Π’ΠΈΠ»ΡŒΡΠΌΡ, 2006

Using SQLite. — Jay A. Kreibich — O’Reilly Media 2010

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1

CppNamedPipeServer.cpp

#include

#include

#include

#include

#include «iostream»

#include

#include «atlstr.h»

#include «sqlite3.h»

#define BUFSIZE 512

using namespace std;

DWORD WINAPI InstanceThread (LPVOID);

VOID GetAnswerToRequest (LPTSTR, LPTSTR, LPDWORD);

sqlite3 *db = 0; // хэндл ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° соСдинСниС ΠΊ Π‘Π”

char *err = 0;

int _tmain (VOID)

{

BOOL fConnected = FALSE;

DWORD dwThreadId = 0;

HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL;

LPTSTR lpszPipename = TEXT («\\.\pipe\SamplePipe»);

if (sqlite3_open («db1.dblite», &db))

printf («Error in open/create DB: %sn», sqlite3_errmsg (db));

for (;;)

{

_tprintf (TEXT («nPipe Server: Main thread awaiting client connection on %sn»), lpszPipename);

hPipe = CreateNamedPipe (

lpszPipename, // pipe name

PIPE_ACCESS_DUPLEX, // read/write access

PIPE_TYPE_MESSAGE | // message type pipe

PIPE_READMODE_MESSAGE | // message-read mode

PIPE_WAIT, // blocking mode

PIPE_UNLIMITED_INSTANCES, // max. instances

BUFSIZE, // output buffer size

BUFSIZE, // input buffer size

0, // client time-out

NULL); // default security attribute

if (hPipe == INVALID_HANDLE_VALUE)

{

_tprintf (TEXT («CreateNamedPipe failed, GLE=%d.n»), GetLastError ());

return -1;

}

fConnected = ConnectNamedPipe (hPipe, NULL) ?

TRUE: (GetLastError () == ERROR_PIPE_CONNECTED);

if (fConnected)

{

printf («Client connected, creating a processing thread. n»);

// Create a thread for this client.

hThread = CreateThread (

NULL, // no security attribute

0, // default stack size

InstanceThread, // thread proc

(LPVOID) hPipe, // thread parameter

0, // not suspended

&dwThreadId); // returns thread ID

if (hThread == NULL)

{

_tprintf (TEXT («CreateThread failed, GLE=%d.n»), GetLastError ());

return -1;

}

else CloseHandle (hThread);

}

else

// The client could not connect, so close the pipe.

CloseHandle (hPipe);

}

return 0;

}

DWORD WINAPI InstanceThread (LPVOID lpvParam)

{

HANDLE hHeap = GetProcessHeap ();

TCHAR* pchRequest = (TCHAR*)HeapAlloc (hHeap, 0, BUFSIZE*sizeof (TCHAR));

TCHAR* pchReply = (TCHAR*)HeapAlloc (hHeap, 0, BUFSIZE*sizeof (TCHAR));

DWORD cbBytesRead = 0, cbReplyBytes = 0, cbWritten = 0;

BOOL fSuccess = FALSE;

HANDLE hPipe = NULL;

if (lpvParam == NULL)

{

printf («nERROR — Pipe Server Failure: n»);

printf («InstanceThread got an unexpected NULL value in lpvParam. n»);

printf («InstanceThread exitting. n»);

if (pchReply ≠ NULL) HeapFree (hHeap, 0, pchReply);

if (pchRequest ≠ NULL) HeapFree (hHeap, 0, pchRequest);

return (DWORD)-1;

}

if (pchRequest == NULL)

{

printf («nERROR — Pipe Server Failure: n»);

printf («InstanceThread got an unexpected NULL heap allocation. n»);

printf («InstanceThread exitting. n»);

if (pchReply ≠ NULL) HeapFree (hHeap, 0, pchReply);

return (DWORD)-1;

}

if (pchReply == NULL)

{

printf («nERROR — Pipe Server Failure: n»);

printf («InstanceThread got an unexpected NULL heap allocation. n»);

printf («InstanceThread exitting. n»);

if (pchRequest ≠ NULL) HeapFree (hHeap, 0, pchRequest);

return (DWORD)-1;

}

// Print verbose messages. In production code, this should be for debugging only.

printf («InstanceThread created, receiving and processing messages. n»);

hPipe = (HANDLE) lpvParam;

// Loop until done reading

while (1)

{

fSuccess = ReadFile (

hPipe, // handle to pipe

pchRequest, // buffer to receive data

BUFSIZE*sizeof (TCHAR), // size of buffer

&cbBytesRead, // number of bytes read

NULL); // not overlapped I/O

if (!fSuccess || cbBytesRead == 0)

{

if (GetLastError () == ERROR_BROKEN_PIPE)

{

_tprintf (TEXT («InstanceThread: client disconnected. n»), GetLastError ());

}

else

{

_tprintf (TEXT («InstanceThread ReadFile failed, GLE=%d.n»), GetLastError ());

}

break;

}

// Process the incoming message.

GetAnswerToRequest (pchRequest, pchReply, &cbReplyBytes);

// Write the reply to the pipe.

fSuccess = WriteFile (

hPipe, // handle to pipe

pchReply, // buffer to write from

cbReplyBytes, // number of bytes to write

&cbWritten, // number of bytes written

NULL); // not overlapped I/O

if (!fSuccess || cbReplyBytes ≠ cbWritten)

{

_tprintf (TEXT («InstanceThread WriteFile failed, GLE=%d.n»), GetLastError ());

break;

}

}

FlushFileBuffers (hPipe);

DisconnectNamedPipe (hPipe);

CloseHandle (hPipe);

HeapFree (hHeap, 0, pchRequest);

HeapFree (hHeap, 0, pchReply);

printf («InstanceThread exitting. n»);

return 1;

}

VOID GetAnswerToRequest (wchar_t* pchRequest,

LPTSTR pchReply,

LPDWORD pchBytes)

{

_tprintf (TEXT («Client Request String:» %s" n"), pchRequest);

wcout << pchRequest << _T («(wchar_t *)») << endl;

size_t origsize = wcslen (pchRequest) + 1;

size_t convertedChars = 0;

const size_t newsize = origsize*2;

char *sqlreq = new char[newsize];

wcstombs_s (&convertedChars, sqlreq, newsize, pchRequest, _TRUNCATE);

cout <<" SQL request: «<< sqlreq << endl;

wchar_t *response;

response = L" «;

if (sqlite3_exec (db, sqlreq, 0, 0, &err))

{

printf («SQL Error: %sn», err);

sqlite3_free (err);

response = L" SQL Error" ;

} else response = L" Success" ;

// Check the outgoing message to make sure it’s not too long for the buffer.

if (FAILED (StringCchCopy (pchReply, BUFSIZE, response)))

{

*pchBytes = 0;

pchReply[0] = 0;

printf («StringCchCopy failed, no outgoing message. n»);

return;

}

*pchBytes = (lstrlen (pchReply)+1)*sizeof (TCHAR);

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2

CppNamedPipeClient.cpp

#pragma region Includes

#include

#include

#include «iostream»

#pragma endregion

#include «SQLite_API.h»

// The full name of the pipe in the format of \servernamepipepipename.

#define SERVER_NAME L" ."

#define PIPE_NAME L" SamplePipe"

#define FULL_PIPE_NAME L" \" SERVER_NAME L" \pipe" PIPE_NAME

#define BUFFER_SIZE 1024

// Request message from client to server.

#define REQUEST_MESSAGE L" CREATE TABLE IF NOT EXISTS foo (a, b, c); INSERT INTO FOO VALUES (1,2,3); INSERT INTO FOO SELECT * FROM FOO;"

using namespace std;

int wmain (int argc, wchar_t* argv[])

{

wchar_t req_str[200];

Pipe_SERVER server (FULL_PIPE_NAME);

// Try to open the named pipe identified by the pipe name.

int err = server. connect ();

if (err == 1) {

cout << «Error while connection» ;

server.cleanup ();

system («pause»);

return 0;

}

wprintf (L" Enter Request:");

wscanf (L" %[^rn]", req_str);

// Send a request from client to server

if (server.send_data (req_str, sizeof (req_str)) ≠0) {

cout << «error while sending data» ;

server.cleanup ();

system («pause»);

return 0;

} else {

cout << «Success in sending» <

}

// Receive a response from server.

//Code from exhample

if (server.recieve_data () == 0)

wprintf (L" Recieved successfull. Data: «%s» n", server. chResponse);

server.cleanup ();

system («pause»);

return server. dwError;

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 3

SQLite_API.h

#include

#include

#include «iostream»

#pragma endregion

class Pipe_SERVER

{

private:

HANDLE hPipe;

LPCWSTR FULL_PIPE_NAME;

static const int BUFFER_SIZE = 1024;

public:

DWORD dwError;

TCHAR chResponse[BUFFER_SIZE]; //Answers from server

Pipe_SERVER (LPCWSTR PIPE_NAME){

hPipe = INVALID_HANDLE_VALUE;

dwError = ERROR_SUCCESS;

FULL_PIPE_NAME = PIPE_NAME;

}

int connect (){

while (TRUE){

hPipe = CreateFile (

FULL_PIPE_NAME, // Pipe name

GENERIC_READ | GENERIC_WRITE, // Read and write access

0, // No sharing

NULL, // Default security attributes

OPEN_EXISTING, // Opens existing pipe

0, // Default attributes

NULL // No template file

);

if (hPipe ≠ INVALID_HANDLE_VALUE)

{

wprintf (L" The named pipe (%s) is connected. n", FULL_PIPE_NAME);

break;

}

dwError = GetLastError ();

if (ERROR_PIPE_BUSY ≠ dwError)

{

wprintf (L" Unable to open named pipe w/err 0x%08lxn", dwError);

return 1;

}

// All pipe instances are busy, so wait for 5 seconds.

if (!WaitNamedPipe (FULL_PIPE_NAME, 5000))

{

dwError = GetLastError ();

wprintf (L" Could not open pipe: 5 second wait timed out.");

return 1;

}

}

// Set the read mode and the blocking mode of the named pipe. In this

// sample, we set data to be read from the pipe as a stream of messages.

DWORD dwMode = PIPE_READMODE_MESSAGE;

if (!SetNamedPipeHandleState (hPipe, &dwMode, NULL, NULL))

{

dwError = GetLastError ();

wprintf (L" SetNamedPipeHandleState failed w/err 0x%08lxn", dwError);

return 0;

}

return 0;

}

int send_data (wchar_t *chRequest, int length){

DWORD cbWritten;

wprintf (L" Sizeof %d of message: %sn", length, chRequest);

;

if (!WriteFile (

hPipe, // Handle of the pipe

chRequest, // Message to be written

length, // Number of bytes to write

&cbWritten, // Number of bytes written

NULL // Not overlapped

))

{

dwError = GetLastError ();

wprintf (L" WriteFile to pipe failed w/err 0x%08lxn", dwError);

return 1;

cleanup ();

}

wprintf (L" Send %ld bytes to server: «%s» n", cbWritten, chRequest);

return 0;

}

int recieve_data (){

BOOL fFinishRead = FALSE;

do

{

DWORD cbResponse, cbRead;

cbResponse = sizeof (chResponse);

fFinishRead = ReadFile (

hPipe, // Handle of the pipe

chResponse, // Buffer to receive the reply

cbResponse, // Size of buffer in bytes

&cbRead, // Number of bytes read

NULL // Not overlapped

);

if (!fFinishRead && ERROR_MORE_DATA ≠ GetLastError ())

{

dwError = GetLastError ();

wprintf (L" ReadFile from pipe failed w/err 0x%08lxn", dwError);

cleanup ();

return 1;

}

} while (!fFinishRead); // Repeat loop if ERROR_MORE_DATA

return 0;

}

void cleanup (){

// Centralized cleanup for all allocated resources.

if (hPipe ≠ INVALID_HANDLE_VALUE)

{

CloseHandle (hPipe);

hPipe = INVALID_HANDLE_VALUE;

}

std:cout << «Cleanup» ;

}

};

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