Π”ΠΈΠΏΠ»ΠΎΠΌΡ‹, курсовыС, Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚Ρ‹, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅...
Брочная ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅

Ѐайловая систСма

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

Другая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° — использованиС ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Часто ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… строк прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π» отдСляСт ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, содСрТащСгося Π² ΡΡ‚ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях принято Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ (этот символ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΡΠ°ΠΌΠΈΡ… ΠΈΠΌΠ΅Π½Π°Ρ…). А Ρ€Π°Π· Ρ‚Π°ΠΊ, Ρ‚ΠΎ Π²ΠΎ Π²ΡΠ΅… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Ѐайловая систСма (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Ѐайловая систСма

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² Windows содСрТится свой Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π’ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 16Ρ‚ΠΈ разрядных вСрсиях Windows (ΠΏΠΎ 3. x Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°Π»ΠΈΡΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ MS-DOS. НСпосрСдствСнно Π² Windows описан Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, для выполнСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ всСгда ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ 0×21. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½ΠΈΡ…, 32Ρ… разрядныС вСрсии Windows содСрТат ΡƒΠΆΠ΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΏΡ€ΠΈ этом использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ MS-DOS Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ся. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Win32 API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ — это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Windows API.

Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ Ρ‚ΠΎΠΌΠ°ΠΌΠΈ Π² Windows API

Π’ Windows 3. x ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ся файловая систСма MS-DOS. Π’ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… вСрсиях Windows Π²ΠΎΠΎΠ±Ρ‰Π΅ вся Ρ€Π°Π±ΠΎΡ‚Π° с Π΄ΠΈΡΠΊΠ°ΠΌΠΈ просто ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΠΎΠ²Ρ‹Π²Π°Π»Π°ΡΡŒ ΠΊ Ρ„ункциям MS-DOS, Π² ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Windows for Workgroup 3.11, Π² Ρ‡Π°ΡΡ‚Π½Ρ‹Ρ… случаях ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнныС срСдства, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ доступ ΠΊ Π΄ΠΈΡΠΊΡƒ ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ Π² 32Ρ… разрядном Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π­Ρ‚ΠΎ нСсколько ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ обращСниям ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π° Π΄ΠΈΡΠΊΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ процСссора ΠΈΠ· Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. ΠŸΡ€ΠΈ этом систСма провСряСт, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ диску, ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ нСстандартныС DOS-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹), Ρ‚ΠΎ Π΄Π»Ρ доступа ΠΊ Π΄ΠΈΡΠΊΡƒ ΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ срСдства MS-DOS, ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсиях Windows.

Π€Π°ΠΉΠ»Ρ‹ (file) Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ (directory ΠΈΠ»ΠΈ folder, ΠΏΠ°ΠΏΠΊΠΈ). Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ большоС количСство Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ строго Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡƒΡŽ структуру — Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ…, Π½ΠΎ ΡΠ°ΠΌ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄ΠΈΠ½ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня). На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ‚ΠΎΠΌΠ΅ (volume) сущСствуСт ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ самого Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня — ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ (root directory). Для обозначСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΡƒΠΊΠ²Ρ‹ английского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, начиная с «a».

ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ² (file name) ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² (directory name, folder name) Π² Windows API, ΠΊΠ°ΠΊ ΠΈ Π² MS-DOS, состоят ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ, Π΄Π»ΠΈΠ½ΠΎΠΉ Π΄ΠΎ 8 символов ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π΄Π»ΠΈΠ½ΠΎΠΉ Π΄ΠΎ 3 символов, отдСляСмого ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ максимальная Π΄Π»ΠΈΠ½Π° ΠΈΠΌΠ΅Π½ΠΈ составляСт 12 символов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. Для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ задания Ρ„Π°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ имя, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π½Π°Ρ…одится. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ список ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π»ΠΈΠ±ΠΎ ΠΎΡ‚ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ρ‚ΠΎΠΌΠ° Π΄ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, содСрТащСго Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

Имя Ρ‚ΠΎΠΌΠ°, ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΈΠΌΡ Ρ„Π°ΠΉΠ»Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° (path name). ПолноС имя начинаСтся с Π½Π°Π·Π²Π°Π½ΠΈΡ Ρ‚ΠΎΠΌΠ°, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅, обратная косая Ρ‡Π΅Ρ€Ρ‚Π° ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, раздСляСмых ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ косыми Ρ‡Π΅Ρ€Ρ‚Π°ΠΌΠΈ, Π·Π°Ρ‚Π΅ΠΌ слСдуСт имя Ρ„Π°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, отдСляСмоС Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. НапримСр: E: MkaBookSamples1a. cpp

Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ„Π°ΠΉΠ» 1a. cpp, находящийся ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Samples, Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Book ΠΈ, вмСстС с Π½ΠΈΠΌ, Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Mka, хранящийся Π½Π° Ρ‚ΠΎΠΌΠ΅ E.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΠ° сущСствуСт понятиС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (current directory). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ сущСствуСт понятиС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΠΌΠ° (диска) (current drive). Для задания Ρ„Π°ΠΉΠ»Π°, находящСгося Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ‚ΠΎΠΌΠ°, достаточно просто ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя этого Ρ„Π°ΠΉΠ»Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ диск Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π½Π΅ΠΌ Π² ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ½ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π’ ΡΡ‚ΠΎΠΌ случаС систСма Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ Ρ‚ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ диск, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ для ΠΏΡ€Π΅ΠΆΠ½Π΅Π³ΠΎ диска.

Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

1a.cpp — Π·Π°Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» 1a. cpp Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ диска

E:1a.cpp — Π·Π°Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» 1a. cpp Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ‚ΠΎΠΌΠ° E

E:1a.cpp — Π·Π°Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» 1a. cpp Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ‚ΠΎΠΌΠ° E

1a.cpp — Π·Π°Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» 1a. cpp Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ диска БистСма допускаСт использованиС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ «.» (Ρ‚ΠΎΡ‡ΠΊΠ°) ΠΈ «.» (Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ) для задания Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ Π΄Π»Ρ задания ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня. НапримСр, ΠΏΡƒΡΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ E: MkaBookSamples, Ρ‚ΠΎΠ³Π΄Π°:

.1a.doc — Π·Π°Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» E: MkaBookSamples1a. cpp

.Chapter2.doc — Π·Π°Π΄Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» E: MkaBookChapter2. doc

Π’ ΡΠΈΡΡ‚Π΅ΠΌΠ΅ запрСщаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ стандартных устройств, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ CON, COM2, LPT1, PRN ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

БистСма ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° 144 символами. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π·Π°Ρ€Π°Π½Π΅Π΅ извСстно, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΡ‚ этой Π΄Π»ΠΈΠ½Ρ‹, Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ статичСски выдСляСмыС области, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ‚ся.

БобствСнно Π² Windows 3. x ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ся нСбольшой Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ… основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ — созданиС, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ указатСля, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, запись ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅; ΠΏΠΎΠΌΠΈΠΌΠΎ этого прСдусмотрСно нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΉ для раздСлСния доступа, пСрСимСнования ΠΈΠ»ΠΈ копирования Ρ„Π°ΠΉΠ»ΠΎΠ², создания ΠΈ ΡΠΌΠ΅Π½Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚риваСтся. ΠŸΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ 0×21, Π»ΠΈΠ±ΠΎ функциями стандартной C-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

HFILE _lcreat (lpszFilename, fnAttribute);

HFILE _lopen (lpszFilename, fnOpenMode);

LONG _llseek (hf, lOffset, nOrigin);

UINT _lread (hf, hpvBuffer, cbBuffer);

UINT _lwrite (hf, hpvBuffer, cbBuffer);

long _hread (hf, hpvBuffer, cbBuffer);

long _hwrite (hf, hpvBuffer, cbBuffer);

HFILE _lclose (hf);

НазначСниС этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ понятно ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΡ. Π‘Ρ€Π΅Π΄ΠΈ Π½ΠΈΡ… интСрСсны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ — _hread ΠΈ _hwrite — ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для чтСния ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ. Под большими Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ 65 535 Π±Π°ΠΉΡ‚ (64K), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ 16Ρ‚ΠΈ разрядного сСгмСнта. Для 16Ρ‚ΠΈ разрядной ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Windows 3. x ΡΡ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

НСудобным Π² Ρ„ункциях Windows API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для Ρ„Π»Π°Π³ΠΎΠ² этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ прСдусмотрСны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числовыС значСния, Π° Π½Π΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _lcreat ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ fnAttribute Ρ€Π°Π²Π½Ρ‹ΠΉ 0, соотвСтствуСт созданию ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π° 2 — скрытого. Или для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _llseek ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nOrigin Ρ€Π°Π²Π½Ρ‹ΠΉ 1 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ полоТСния ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ, Π° Π½Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π°. ВсС эти константы Ρ‚Π°ΠΊ ΠΈ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ числа, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²Ρƒ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Windows Ρ…Π΅Π½Π΄Π»Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ…Π΅Π½Π΄Π»Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² MS-DOS. Π­Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ срСдства для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ ошибкС: Π² Windows принято, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 для Ρ…Π΅Π½Π΄Π»Π° являСтся нСдопустимым; Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ обычная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅Π½Π΄Π»Π° ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° выглядит Ρ‚Π°ΠΊ:

HANDLE hObject;

hObject = Get…(…); // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ…Π΅Π½Π΄Π» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

if (hObject) {// провСряСм Π΅Π³ΠΎ…

// всС Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅

} else {

// ошибка!}

Однако ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΎΠΉ способ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π΅Π½ — Ρ…Π΅Π½Π΄Π» Ρ„Π°ΠΉΠ»Π°, Ρ€Π°Π²Π½Ρ‹ΠΉ 0, Π² MS-DOS соотвСтствуСт стандартному устройству для Π²Ρ‹Π²ΠΎΠ΄Π° (stdout), Π° Π½Π΅ Π½Π΅Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΠΌΡƒ. Для обозначСния ошибки примСняСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅Π½Π΄Π»Π° Ρ„Π°ΠΉΠ»Π° Π½Π΅ 0, Π° -1. Для удобства Π² windows. h ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ символ HFILE_ERROR, Ρ€Π°Π²Π½Ρ‹ΠΉ -1. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

HFILE hFile;

hFile = _lcreat («c:\myfile.dat», 0);

if (hFile ≠ HFILE_ERROR) {

// всС Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅

_lclose (hFile);

} else {

// ошибка!}

Помимо ΡƒΠΆΠ΅ рассмотрСнных Π² Windows прСдусмотрСна ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция, прСдназначСнная для открытия, поиска, удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

HFILE OpenFile (lpszFileName, lpOpenBuff, fuMode);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpOpenBuf являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ OFSTRUCT. Π’ ΡΡ‚ΠΎΠΉ структурС сохраняСтся информация ΠΎΠ± ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π΄Π»Ρ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ открытия (ΠΈΠ»ΠΈ удалСния) Ρ‚ΠΎΠ³ΠΎ-ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠ·ΠΆΠ΅. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ fuMode ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ доступа ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ (Ρ„Π»Π°Π³ΠΈ OF_READ, OF_WRITE, OF_READWRITE), Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ — ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» (OF_CREATE), ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (OF_SHARE_…).

Помимо открытия Ρ„Π°ΠΉΠ»Π° данная функция способна Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ спСцифичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Ρ‚Π΅ΠΌ-ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ fuMode):

ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° OF_DELETE,

поиск Ρ„Π°ΠΉΠ»Π° OF_SEARCH,

ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сущСствования Ρ„Π°ΠΉΠ»Π° OF_EXIST,

ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, сохранСнной Π² ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π΅ OFSTRUCT OF_REOPEN,

ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ структуры OFSTRUCT OF_PARSE,

сравнСниС Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ создания Ρ„Π°ΠΉΠ»Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π΅ OFSTRUCT OF_VERIFY,

Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» (ΠΏΡ€ΠΈ этом функция OF_PROMPT ΠΈ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π½ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ», Π½ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°) OF_CANCEL

Π•Ρ‰Π΅ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Windows носят Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetWindowsDirectory ΠΈ GetSystemDirectory Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, содСрТащСм win.com — ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Windows ΠΈ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ windowssystem).

UINT GetWindowsDirectory (lpszSysPath, cbSysPath)

UINT GetSystemDirectory (lpszSysPath, cbSysPath);

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Windows Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для получСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° — для этого Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ, Π° ΠΈΠ· Π½Π΅Π³ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π΄Π°ΠΆΠ΅ Π²Π°ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Ρ‡Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ):

Int GetModuleFileName (hInstance, lpszFileName, cbFileName);

Π•Ρ‰Π΅ ΠΏΠ°Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Ѐункция GetTempDrive Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠΊΠ²Ρƒ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΡƒΡŽ диск, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (ΠΏΡ€ΠΈ этом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ chDriveLetter Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ся). ΠŸΡ€ΠΈ этом прСдполагаСтся, Ρ‡Ρ‚ΠΎ для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ТСсткий диск (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ C), Π° Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚, Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ диск. Вторая функция — GetTempFileName ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈ этом ΠΎΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния TEMP, Π»ΠΈΠ±ΠΎ, Ссли ΠΎΠ½Π° Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ρ‚ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΠ°, Π»ΠΈΠ±ΠΎ, Ссли ΠΎΠ½ Π½Π΅ Π·Π°Π΄Π°Π½, ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ТСсткого диска (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ C).

BYTE GetTempDrive (chDriveLetter);

Int GetTempFileName (chDriveLetter, lpszPrefixString, uUnique, lpszTempFileName);

Однако эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для формирования ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. БобствСнно Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ этот Ρ„Π°ΠΉΠ» Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ — для Π΅Π³ΠΎ удалСния послС закрытия Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, систСма Π·Π° Π²Π°Ρ этого Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ‚.

Ѐункция SetHandleCount позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ максимально допустимоС число ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄ΠΎ 20 Ρ„Π°ΠΉΠ»ΠΎΠ² сразу.

UINT SetHandleCount (cHandles);

ПослСдняя функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ дискового устройства. К ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ эта информация ΠΊΡ€Π°ΠΉΠ½Π΅ скудна — Windows распознаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° дисковых устройств: фиксированныС (DRIVE_FIXED), смСнныС (DRIVE_REMOVABLE) ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ (DRIVE_REMOTE):

UINT GetDriveType (nDriveNumber);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nDriveNumber Π·Π°Π΄Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ диска: устройство «A» ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ 0, «C» — 2 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏ диска (DRIVE_FIXED, DRIVE_REMOVABLE, DRIVE_REMOTE), Π»ΠΈΠ±ΠΎ, Π² ΡΠ»ΡƒΡ‡Π°Π΅ ошибки, 0.

Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ Ρ‚ΠΎΠΌΠ°ΠΌΠΈ Π² Win32 API

БрСдства для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² Win32 API сущСствСнно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΡΡ€Π΅Π΄ΡΡ‚Π² Π² Windows API. Одна ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… сущСствСнных, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, особСнностСй — использованиС Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ². Π’Π°ΠΊ для ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ систСма ΠΎΡ‚Π²ΠΎΠ΄ΠΈΡ‚ 255 символов. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ использованиС ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° для хранСния ΠΏΠΎΠ»Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² нСдопустимо! Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя содСрТит ΠΏΡƒΡ‚ΡŒ, часто Π½Π°ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ дСсяток Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π° ΠΈΡ… ΠΈΠΌΠ΅Π½Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π»ΠΈΠ½ΠΎΠΉ Π΄ΠΎ 255 символов ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, Π΄Π° Π΅Ρ‰Π΅ само имя Ρ„Π°ΠΉΠ»Π°, Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ достаточный Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° просто Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚авляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, тСорСтичСски ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ 5−10 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ имя, надСясь, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ со ΡΡ‚ΠΎΠ»ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Но ΡΡ‚ΠΎ Π΄Π΅Π»ΠΎ чисто вСроятностноС — ΠΏΠΎΠΊΠ° ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ хотя-Π±Ρ‹ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ€ΡƒΠΊΠ°ΠΌΠΈ, ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ Π½ΠΈΠΊΡ‚ΠΎ ΠΈ Π½Π΅ Π΄Π΅Π»Π°Π», Π½ΠΎ Π² ΡΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… систСмах интСрфСйс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° приходится ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ лишь ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ — ΠΏΡ€ΠΈ Π΅Π³ΠΎ создании ΠΈ ΠΏΡ€ΠΈ этом набираСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя, Π° Π½Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ. Π­Ρ‚ΠΎ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ стСпСни ΠΏΡ€ΠΎΠ²ΠΎΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½.

Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π°Π΄ΠΎ сначала ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, ΡƒΠ·Π½Π°Π² Π΄Π»ΠΈΠ½Ρƒ ΠΈΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Π΅ΠΌ динамичСски Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ пространство, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ имя. ΠŸΡ€ΠΈ этом Π½Π°Π΄ΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ прилоТСния Win32 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ скомпилированы для использования UNICODE, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, Π° Π΄Π²Π°, Ρ‡Ρ‚ΠΎ автоматичСски ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°.

Иногда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΈΠΌΠ΅Π½ вмСсто Π΄Π»ΠΈΠ½Π½Ρ‹Ρ…. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² 32Ρ… разрядной систСмС Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ запуск 16Ρ‚ΠΈ разрядных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Windows ΠΈ Π·Π°Π΄Π°Ρ‡ MS-DOS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, СстСствСнно, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ старыС прилоТСния ΠΌΠΎΠ³Π»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊΠΎ Π²ΡΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ, систСма автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°, ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‰ΠΈΠ΅ΡΡ соглашСниям MS-DOS. ВсС 16Ρ‚ΠΈ разрядныС прилоТСния Windows ΠΈ Π²ΡΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ MS-DOS ΠΈΠΌΠ΅ΡŽΡ‚ Π΄Π΅Π»ΠΎ с ΡΡ‚ΠΈΠΌΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. Π’ Win32 API прСдусмотрСны ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (GetShortPathName ΠΈ GetFullPathName) для получСния ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Однако Π½Π°Π΄ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ всС-Ρ‚Π°ΠΊΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ старых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ — полная Π΄Π»ΠΈΠ½Π° ΠΏΡƒΡ‚ΠΈ (Π΄Π°ΠΆΠ΅ составлСнного ΠΈΠ· ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… ΠΈΠΌΠ΅Π½) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΡ‚ΡŒ 144 символа, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ число Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. ΠŸΡ€ΠΈ этом 32Ρ… разрядная систСма (Windows-95 ΠΈΠ»ΠΈ Windows NT) Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌΠΈ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ запрятанными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ спокойно, Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΡΡ‚ΠΈΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ срСдствами MS-DOS ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΡΡ‚Π°Ρ€Ρ‹ΠΌΠΈ 16Ρ‚ΠΈ разрядными прилоТСниями Windows Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ошибок. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ — смотря ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ: Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ (Π΄Π»ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ 144 символа), ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΡ… Π΄Π»ΠΈΠ½Π° сущСствСнно мСньшС).

DWORD GetFullPathName (lpszFile, cchPath, lpszLongPath, plpszFileNamePart);

DWORD GetShortPathName (lpszLongPath, lpszShortPath, cchBuffer);

Ѐункция GetFullPathName Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡƒΡ‚ΡŒ, Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ lpszFile. Если ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ имя Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΏΡƒΡ‚ΠΈ, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ся, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» находится Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Ѐункция GetShortPathName выполняСт ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ — ΠΎΠ½Π° сообщаСт ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ.

Другая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° — использованиС ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Часто ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Ρ… строк прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π» отдСляСт ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, содСрТащСгося Π² ΡΡ‚ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях принято Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° Π² Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ (этот символ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΡΠ°ΠΌΠΈΡ… ΠΈΠΌΠ΅Π½Π°Ρ…). А Ρ€Π°Π· Ρ‚Π°ΠΊ, Ρ‚ΠΎ Π²ΠΎ Π²ΡΠ΅ срСдства Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π½Π°Π΄ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ (Π»ΠΈΠ±ΠΎ Π½Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ…, Ссли Π² ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²). Π‘ΠΎΠ»ΡŒΡˆΠ΅ всСго ошибок Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ пСрСносС старых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Win32. МногиС солидныС программисты просто Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ какая-Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ отлаТСнная библиотСчная функция, ΡΠ»ΡƒΠΆΠΈΠ²ΡˆΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ ΠΈΠΌ Π²Π΅Ρ€ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²Π΄ΠΎΠΉ, Π²Π΄Ρ€ΡƒΠ³ даст ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π°Ρ‚ΠΊΠ½ΡƒΠ²ΡˆΠΈΡΡŒ Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π» Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. А ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ всС Ρ‚Π°ΠΊΠΈΠ΅ ошибки Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. Π’Π°ΠΊΠΈΠ΅ ошибки проскакивали Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅, коммСрчСскиС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ компилятор Watcom C/C++ 10.5 содСрТит Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΈΡ… ошибок, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ°ΠΊ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Ρ‚Π°ΠΊ ΠΈ Π² ΡΠ°ΠΌΠΎΠΉ срСдС.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нюанс, ΠΏΡ€Π°Π²Π΄Π° ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшой, связан с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ символ «.» (Ρ‚ΠΎΡ‡ΠΊΠ°) ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для отдСлСния ΠΈΠΌΠ΅Π½ΠΈ ΠΎΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π² ΡΠ°ΠΌΠΎΠΌ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΏΠΎΠ΄ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ подразумСваСтся Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΈ, отдСлСнная самой ΠΏΡ€Π°Π²ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π΄ΠΊΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡˆΠΈΠ±ΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΈΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ справа Π½Π°Π»Π΅Π²ΠΎ Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащиС ΠΈΠΌΠ΅Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΡ‡ΠΊΠΈ, входящиС Π² ΠΈΠΌΡ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ имя Ρ„Π°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅.

Помимо этого слСдуСт ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π΄Π²Π΅ косыС Ρ‡Π΅Ρ€Ρ‚Ρ‹ подряд. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ «\.A:» соотвСтствуСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ доступа ΠΊ Ρ‚ΠΎΠΌΡƒ «A» (Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° C ΡΡ‚ΠΎ имя Π±ΡƒΠ΄Π΅Ρ‚ записано ΠΊΠ°ΠΊ «\\.\A:»).

ВсС рассмотрСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π² Win32 API, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ Π½ΠΈΡ… Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€Π°Π²Π΄Π° рСализация ΠΏΡ€Π΅ΠΆΠ½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ нСсколько измСнилась; Ρ‚Π°ΠΊ функция SetHandleCount ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π² Windows NT просто потСряла смысл — для описания Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ динамичСски выдСляСмоС пространство, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _lread ΠΈ _lwrite ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Ρ„ункциями _hread ΠΈ _hwrite соотвСтствСнно. МногиС ΠΈΠ· ΡΡ‚Π°Ρ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈ Π² Win32 API, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ нСсколько большими Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ возмоТностями, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _lread ΠΈ _lwrite ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ ReadFile, ReadFileEx, WriteFile ΠΈ WriteFileEx.

Π Π°Π±ΠΎΡ‚Π° с Ρ‚ΠΎΠΌΠ°ΠΌΠΈ

Win32 API прСдоставляСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ срСдств для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Ρ‚ΠΎΠΌΠ°ΠΌΠΈ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅ΠΆΠ½ΠΈΡ… вСрсий Windows, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто использовали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MS-DOS. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Win32 API для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π½Π΅ ΠΎΠ΄Π½Ρƒ Π±ΡƒΠΊΠ²Ρƒ, ΠΈ Π½Π΅ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΎΠΌΠ°, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Π² MS-DOS, Π° ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Ρ‚ΠΎΠΌΠ°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это строка Π²ΠΈΠ΄Π° X, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π² ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π΄ΠΊΠΈΡ… случаях, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Windows 3. x ΠΈ Win32s Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π° 32Ρ… разрядного прилоТСния Π² 16Ρ‚ΠΈ разрядной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ доступ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΠ° (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ join). Π’ ΡΡ‚ΠΎΠΌ случаС характСристики Ρ‚ΠΎΠΌΠ° Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° этого Ρ‚ΠΎΠΌΠ° ΠΌΠΎΠ³ΡƒΡ‚ сущСствСнно Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ — скаТСм, Ρ‚ΠΎΠΌ являСтся Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ ТСсткого диска, Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² соотвСтствуСт CD-ROM ΠΈΠ»ΠΈ RAM диску.

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ рассмотрим основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Win32 API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚ΠΎΠΌΠ°ΠΌΠΈ.

DWORD GetLogicalDrives (void);

DWORD GetLogicalDriveStrings (nBufferSize, lpszBuffer);

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ Ρ‚ΠΎΠΌΠ°Ρ…. Ѐункция GetLogicalDrives Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово, установлСнныС Π² 1 Π±ΠΈΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΡΡ Ρ‚ΠΎΠΌΠ°ΠΌ. Π‘ΠΎΠ»Π΅Π΅ интСрСсная функция GetLogicalDriveStrings Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΈΠ· ΠΈΠΌΠ΅Π½ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Ρ‚ΠΎΠΌΠΎΠ². ИмСна Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой символом `', Π° Π²Π΅ΡΡŒ список Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ двумя символами `'.

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ утвСрТдСния, Ρ‡Ρ‚ΠΎ эта функция Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Windows NT, ΠΎΠ΄Π½Π°ΠΊΠΎ это Π½Π΅ Ρ‚Π°ΠΊ — Π² Windows-95 (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π² Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ русской вСрсии 4.0.950a) ΠΎΠ½Π° Ρ‚ΠΎΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. Π’ΠΎΡ‡Π½ΠΎ Π΅Π΅ Π½Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Win32s. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GetLogicalDriveStrings, Π»ΠΈΠ±ΠΎ, ΠΏΡ€ΠΈ Π΅Π΅ ΠΎΡ‚сутствии, ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetLogicalDrives (Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ сдСлано Π² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 2B).

Π”Ρ€ΡƒΠ³ΠΎΠΉ интСрСсный нюанс этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ связан с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ для получСния ΠΎΡ‚ Π½Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ нСизвСстной Π·Π°Ρ€Π°Π½Π΅Π΅ Π΄Π»ΠΈΠ½Ρ‹ (ΠΊΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Win32 API, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ). МоТно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ с Π±ΠΎΠ»ΡŒΡˆΠΈΠΌ запасом ΠΈ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. Π›ΡƒΡ‡ΡˆΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, сначала ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ пространство, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅:

DWORD dwSize = GetLogicalDriveStrings (0, NULL); // ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ

LPTSTR lpszStrings = new TCHAR [ dwSize+1 ]; // +1 = для символа `'

GetLogicalDriveStrings (dwSize, lpszStrings);

for (LPTSTR p = lpszStrings; *p; p += lstrlen (p) + 1) {

// `p' ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΠ°}

delete lpszStrings;

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ рассматриваСмая функция — GetDriveType — Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ Ρ‚ΠΎΠΌΠ°. Π’ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌ Windows API сущСствовал Π°Π½Π°Π»ΠΎΠ³ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π» вмСсто ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ρ‚ΠΎΠΌΠ° Π½ΠΎΠΌΠ΅Ρ€ логичСского диска ΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π» нСсколько мСньшСС количСство Ρ‚ΠΈΠΏΠΎΠ² Ρ‚ΠΎΠΌΠΎΠ² — CD-ROMΡ‹ ΠΈ RAM диски ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π²Π°Π»ΠΈΡΡŒ.

UINT GetDriveType (lpszRoot);

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

Ѐункция GetVolumeInformation Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌΠ΅. Π‘ Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ Ρ‚ΠΎΠΌΠ° (Π² Windows API для этих Ρ†Π΅Π»Π΅ΠΉ часто искали Ρ„Π°ΠΉΠ» Ρ‚ΠΈΠΏΠ° «ΠΌΠ΅Ρ‚ΠΊΠ° Ρ‚ΠΎΠΌΠ°» Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ этого Ρ‚ΠΎΠΌΠ°), сСрийный Π½ΠΎΠΌΠ΅Ρ€, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚ΠΎΠΌΠ°, Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (NTFS, HPFS, CDFS, FAT), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡƒΡŽ Ρ‚ΠΎΠΌΠΎΠΌ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ свСдСния.

BOOL GetVolumeInformation (

lpszRoot,

lpszVolume, nVolumeSize,

lpdwSerialNumber, lpdwMaxNameLength, lpdwFlags,

lpszFileSystemName, nFileSystemName);

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° функция ошибалась с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… дисков. Π’Π°ΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ большоС количСство ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΈΠ· ΡΠΈΡΡ‚Π΅ΠΌ, установлСнных Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ с Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (Windows 3. x + Win32s, Windows-95, Windows-98, Windows NT) ΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ свои диски Π² ΠΎΠ±Ρ‰Π΅Π΅ пользованиС (список Π΅Ρ‰Π΅ большС — Π²ΠΊΠ»ΡŽΡ‡Π°Ρ систСмы Ρ‚ΠΈΠΏΠ° OS/2, Macintosh, Unix ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅).

Достаточно часто ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ свободного пространства ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΠΌΠ°. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetDiskFreeSpace:

BOOL GetDiskFreeSpace (

lpszRoot,

lpdwSectorsPerCluster, lpdwBytesPerSector,

lpdwFreeClusters, lpdwTotalClusters);

Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ кластСра Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠΌΠ° Π² ΠΊΠ»Π°ΡΡ‚Π΅Ρ€Π°Ρ… ΠΈ ΠΎ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²Π΅ свободных кластСров. ΠšΠ»Π°ΡΡ‚Π΅Ρ€ — ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ объСм пространства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ мСста для хранСния Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠ»Π°ΡΡ‚Π΅Ρ€Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ТСстко Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ‹ с Ρ„изичСской ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΎΠΌΠ°, ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ логичСскоС объСдинСниС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… физичСски выдСляСмых Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° Ρ‚ΠΎΠΌΠ΅. Π’Π°ΠΊ, всС пространство Ρ‚ΠΎΠΌΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ разбиваСтся Π½Π° Ρ„изичСскиС сСктора (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎ 512 Π±Π°ΠΉΡ‚ для ТСстких ΠΈ Π³ΠΈΠ±ΠΊΠΈΡ… дисков ΠΈ 2048;2192 Π±Π°ΠΉΡ‚ для CD-ROM)

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetVolumeLabel Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠΌΠ°:

BOOL SetVolumeLabel (lpszRoot, lpszVolume); // Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Win32s!

БущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π°Ρ взаимодСйствиС нСпосрСдствСнно с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌΠΈ устройств. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ функциям MS-DOS 0×44? (device I/O control, IOCTL), ΠΎΠ΄Π½Π°ΠΊΠΎ возмоТности Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡˆΠΈΡ€Π΅. Π’ Ρ‡ΠΈΡΠ»Π΅ интСрСсных — Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ, замСнялся-Π»ΠΈ Ρ‚ΠΎΠΌ Π² ΡƒΡΡ‚ройствС со ΡΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ носитСлями (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³ΠΈΠ±ΠΊΠΈΠΉ диск), ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ устройства, ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΌ (Π΄ΠΎΡ€ΠΎΠΆΠΊΠΈ диска), ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ диска Π½Π° Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΈ Π΄Π°ΠΆΠ΅ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ диск Π½Π° Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΏΠΎ-Π½ΠΎΠ²ΠΎΠΌΡƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Ѐункция Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π΅ΠΉ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Ρ…Π΅Π½Π΄Π», ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠ΅ устройство. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ этот Ρ…Π΅Π½Π΄Π», ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateFile (см. Π½ΠΈΠΆΠ΅), ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΉ ΡƒΡΠ»ΠΎΠ²Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π² Π²ΠΈΠ΄Π΅ \.A: — для доступа, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊ Ρ‚ΠΎΠΌΡƒ A (Π±ΡƒΠΊΠ²Π°, СстСствСнно, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ диск, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ΅Π½ доступ), ΠΈΠ»ΠΈ \.PhysicalDrive0 — для доступа ΠΊ Ρ„изичСскому ТСсткому диску 0 (Ρ†ΠΈΡ„Ρ€Π° — Π½ΠΎΠΌΠ΅Ρ€ ТСсткого диска, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 0 ΠΈΠ»ΠΈ 1). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Ρ‚СкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ символы «ΠΎΠ±Ρ€Π°Ρ‚ная косая Ρ‡Π΅Ρ€Ρ‚Π°» Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½Ρ‹ Π΄Π²Π°ΠΆΠ΄Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ «\\.\A:».

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! для доступа ΠΊ Π΄ΠΈΡΠΊΠ°ΠΌ Π² Windows NT Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²Π° доступа администратора систСмы!

BOOL DeviceIoControl (// Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Win32s!

hDevice, dwIoControlCode,

lpvInBuffer, cbInBuffer,

lpvOutBuffer, cbOutBuffer,

lpcbBytesReturned,

lpoOverlapped);

Π’ ΡΡ‚ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π·ΠΎΡ€Π½ΠΎ рассмотрСны Π΅Ρ‰Π΅ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡƒΡΡ‚ройствами (это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠΌΠ°). Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Windows NT, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ — ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ прилоТСния, пСрСносимыС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ рСализациями Win32.

BOOL DefineDosDevice (dwFlags, lpszDeviceName, lpTargetPath);

DWORD QueryDosDevice (lpszDeviceName, lpBuffer, cbMaxSize);

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ТСстко привязаны ΠΊ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Π² Windows NT осущСствляСтся доступ ΠΊ Π΅Π΅ ΡƒΡΡ‚ройствам: Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ свой собствСнный способ опрСдСлСния всСх устройств. НапримСр, имя DeviceParallel0 опрСдСляСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚. Однако, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ-ΠΆΠ΅ самого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠ° LPT1, вошСдшиС Π² ΠΎΠ±ΠΈΡ…ΠΎΠ΄ со Π²Ρ€Π΅ΠΌΠ΅Π½, Π±ΠΎΠ»Π΅Π΅ Π΄Ρ€Π΅Π²Π½ΠΈΡ…, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ IBM PC XT. Для удобства Π² Windows NT ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰Π°Ρ соотвСтствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ устройств «Π² ΡΡ‚ΠΈΠ»Π΅ MS-DOS» ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π² ΡΠΈΡΡ‚Π΅ΠΌΠ΅. Π­Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° глобальная, всС Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ прилоТСния (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прилоТСния MS-DOS) ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ доступ ΠΊ ΡƒΡΡ‚ройствам посрСдством этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Ѐункция DefineDosDevice позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ самому Ρ‚Π°ΠΊΠΎΠ΅ соотвСтствиС, Π° Ρ„ункция QueryDosDevice ΡƒΠ·Π½Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ соотвСтствиС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ устройства, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ смотри Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π»ΠΈΠ±ΠΎ Π² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΎΠ΄Π½Π° нСсколько странная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ — ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Win32 API, Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΊΠΎΠ΄ ошибки ERROR_CALL_NOT_IMPLEMENTED, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetLastError. Выглядит такая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

DefineDosDevice (0, «Z:», buffer);

if (GetLastError () ≠ ERROR_SUCCESS) {

// Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка — ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ функция Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ся

} else {

// всС Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅, Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ}

НСсколько Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² Windows 98 эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ΄ ошибки, функция GetLastError Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ERROR_SUCCESS. Однако ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ… ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ — Π² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2B — Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚ΠΎΠΌΠ°ΠΌΠΈ

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

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ осущСствляСтся Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌΠ°Ρ… Π² ΠΎΠΊΠ½ΠΎ прилоТСния. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ-Π±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами:

Π₯ΡƒΠΆΠ΅ Π½Π΅ΠΊΡƒΠ΄Π°. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 1B. CPP ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния WM_PAINT (функция Cls_OnPaint), Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ всС устройства ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. ΠžΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ Π² ΡΡ‚ΠΎΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ опрос ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя, ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡΠΌ ΠΊ ΡƒΡΡ‚ройствам ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ пСрСрисовкС ΠΎΠΊΠ½Π°. Π•Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ чтСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ с ΡƒΡΡ‚ройства Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ошибок, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСма Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ окошкС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ «Cannot read from drive A. Π­Ρ‚ΠΎ окошко окаТСтся, с Π±ΠΎΠ»ΡŒΡˆΠΎΠΉ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΎΠΊΠ½Π° прилоТСния, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΎΠΊΠ½Π° сообщСния, нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ снова ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сообщСниС WM_PAINT, снова ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΎΠΌΡƒ-ΠΆΠ΅ устройству … ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ (Ρ‡Ρ‚ΠΎ Π±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetErrorMode, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π²Ρ‹Π²ΠΎΠ΄ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…).

Π§ΡƒΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΡƒΡΡ‚ройствах ΠΏΡ€ΠΈ создании ΠΎΠΊΠ½Π°, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ вСсь тСкст, Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ WM_PAINT. Π­Ρ‚ΠΎΡ‚ способ качСствСнно Π»ΡƒΡ‡ΡˆΠ΅ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ осущСствляСтся Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π² Ρ€Π°Π·Π½ΠΎΠ΅ врСмя. Однако ΠΈ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ минусы — список устройств ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния, Π° ΠΎΠ½ΠΎ этого Π½Π΅ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚, ΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, список ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ достаточно большим — большС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°. ΠŸΠ΅Ρ€Π²ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ сСйчас Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ — этого Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ввСдя мСню с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ (Refresh) ΠΈΠ»ΠΈ выполняя Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Вторая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡŽ собствСнного интСрфСйса — ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСний ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ ΠΌΡ‹ΡˆΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ написания Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Π•Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅. Π§ΡƒΡ‚ΡŒ Ρ€Π°Π·ΠΎΠ²ΡŒΠ΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ способ — ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈ создании ΠΎΠΊΠ½Π°, Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΌΡ‹ΡˆΡŒΡŽ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΠΌ Π½Π° Windows. Windows прСдоставляСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ нСсколько стандартных классов ΠΎΠΊΠΎΠ½, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… самыС распространСнныС элСмСнты управлСния — ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ρ„Π»Π°ΠΆΠΊΠΈ, списки, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ ΠΎΠΊΠ½ΠΎ-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π’ΠΎΡ‚ ΠΎΠΊΠ½ΠΎΠΌ-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ тСкст являСтся нСизмСняСмым, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠΊΠ½ΠΎ просмотра. Π’ ΡΡ‚ΠΎΠΌ случаС ΠΏΡ€ΠΈ создании Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° прилоТСния, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π΅ ΠΎΠΊΠ½ΠΎ-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π΅ всю Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠΊΠ½Π°ΠΌΠΈ смотри Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…. Π—Π°Ρ‚Π΅ΠΌ, сформировав вСсь Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ тСкст, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρƒ. Окно рСдактирования Π±ΡƒΠ΄Π΅Ρ‚ снабТСно полосами ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΈ ΠΌΡ‹ΡˆΡŒΡŽ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ тСкста Π² Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π° — ΠΈ Π²ΡΠ΅ само, Π±Π΅Π· Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ совсСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ — ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния, связанныС с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° (соотвСтствСнно ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΎΠΊΠ½Π°), ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π° ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_PAINT ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ рассчитано Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Win32, ΠΎΠ΄Π½Π°ΠΊΠΎ это связано Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Win32 API для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌΠ°Ρ…. ΠŸΡ€ΠΈ создании прилоТСния для Windows 3. x Π²ΠΌΠ΅ΡΡ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Windows API, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-эмуляторы, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π² ΡΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ компиляции 16Ρ‚ΠΈ разрядного прилоТСния. Π­Ρ‚ΠΎ обСспСчиваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ компиляции ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Π½Π° ΠΎΠ±Π΅ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, Π½ΠΎ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями Π² ΡΠ»ΡƒΡ‡Π°Π΅ примСнСния Windows API (строго говоря, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-эмуляторы ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ, ΠΎΠΏΠΈΡ€Π°ΡΡΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… MS-DOS — просто это Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ).

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ DefineDosDevice ΠΈ QueryDosDevice, примСняСмыС Π² Ρ‡ΠΈΡΠ»Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Π² ΡΡ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π²ΠΈΠ΄Π΅ 32Ρ… разрядного прилоТСния ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ Windows NT, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ смысл ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Win32 Π² Windows NT.

Π€Π°ΠΉΠ» 2B. CPP

#define STRICT

#include

#include

#define UNUSED_ARG (arg) (arg)=(arg)

#ifndef __NT__

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ компиляции для Windows API

#include «2b16.cpp»

// тСкст Ρ„Π°ΠΉΠ»Π° 2b16. cpp ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅

#endif

static char szWndClass[]= «test volume functions» ;

static HINSTANCE hInstance;

BOOL Cls_OnCreate (HWND hwnd, LPCREATESTRUCT lpCreateStruct)

{UNUSED_ARG (lpCreateStruct);

char *temp, *p, *s;

DWORD n, i, sernum, complen, flags, spc, bps, fc, tc;

char file_system[ 128 ], buffer[ 1024 ];

UINT count, errmode;

HWND hwndView;

RECT rc;

HFILE hf;

static OFSTRUCT ofs;

static char tempfile[] = «c:\test.txt»;

static char devZ[] = «Z:»;

// создадим ΠΎΠΊΠ½ΠΎ-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π΅ всю Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π°

GetClientRect (hwnd, &rc);

// тСорСтичСски Π² CREATESTRUCT ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π°, Π½ΠΎ ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡŽ ΠΎΠ½ΠΈ

// ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ ΠΊΠ°ΠΊ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅, хотя это Π½Π΅ Ρ‚Π°ΠΊ. Ѐункция GetClientRect

// Π² ΡΡ‚ΠΎΠΌ случаС всС Ρ€Π°Π²Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

hwndView = CreateWindow (

" EDIT", «» ,

WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_READONLY,

0, 0, rc. right, rc. bottom, hwnd, (HMENU)1, hInstance, NULL);

if (!IsWindow (hwndView)) {

// Ссли ΠΎΠΊΠ½ΠΎ просмотра ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, Ρ‚ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

// сообщив ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅

MessageBox (NULL, «Cannot create viewer window!», NULL, MB_OK);

return FALSE;}

// для красоты ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠΎΠ½ΠΎΡˆΠΈΡ€ΠΈΠ½Π½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚ (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΡΠΌ. GDI)

SetWindowFont (hwndView, GetStockObject (ANSI_FIXED_FONT), FALSE);

// функция SetWindowFont Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π΅ ΠΎΠΏΠΈΡΠ°Π½Π°, это макрос, опрСдСляСмый

// Π² windowsx. h ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ — см. ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст этого Ρ„Π°ΠΉΠ»Π°.

// Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Ρ…Π΅Π½Π΄Π» ΠΎΠΊΠ½Π° просмотра Π² ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π΅ описания Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

// (ΠΏΡ€ΠΈ рСгистрации класса Π½Π°Π΄ΠΎ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 4 Π±Π°ΠΉΡ‚Π° — Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈ Π²

// Windows API ΠΈ Π² Win32 API ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ значСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)

SetWindowLong (hwnd, 0, (LONG)hwndView);

// 1. ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Π·Π°Ρ€Π°Π½Π΅Π΅, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ мСста ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ для описания всСх

// Ρ‚ΠΎΠΌΠΎΠ² ΠΈ ΡƒΡΡ‚ройств DOS. Для простоты создадим Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Π·Π°Ρ€Π°Π½Π΅Π΅

// Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ c: test. txt (строго говоря, Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ TEMP ΠΈΠ»ΠΈ TMP, ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ

// ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ — Π² ΠΆΠΈΠ·Π½ΠΈ часто ΠΎΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, диск

// ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π° Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ диск — всякоС Π±Ρ‹Π²Π°Π΅Ρ‚ — ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΌ — Π½ΠΎ ΡΡ‚ΠΎ

// всС слишком Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°).

// 2. Π² ΡΡ‚ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΌΡ‹ ΡΠΎΠ±Π΅Ρ€Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ тСкст, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ ΠΎΠΊΠ½Ρƒ

// просмотра, послС Ρ‡Π΅Π³ΠΎ Ρ„Π°ΠΉΠ» ΡƒΠ΄Π°Π»ΠΈΠΌ.

// 3. для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ

// ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ

hf = _lcreat (tempfile, 0);

if (hf == HFILE_ERROR) {

// ΠΏΡ€ΠΈ ошибкС — сообщаСм ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ (ΠΎΠΊΠ½ΠΎ просмотра Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΎ

// ΠΏΠΎΠ·ΠΆΠ΅, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ WM_DESTROY

MessageBox (NULL, «Cannot create temporary file!», NULL, MB_OK);

return FALSE;}

// пишСм ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ

_lwrite (hf, «******** GET VOLUME INFORMATION ********rnrn», 44);

SetLastError (ERROR_SUCCESS);

n = GetLogicalDriveStrings (0, NULL);

if (GetLastError () ≠ ERROR_SUCCESS) {

// Ѐункция GetLogicalDriveStrings Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Win32s ΠΈ (Π² ΠΊΠ½ΠΈΠ³Π°Ρ…

// часто ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚) Π² Windows-95, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° это ΠΈ Ρ‚Π°ΠΊ, Π½ΠΎ Ρƒ ΠΌΠ΅Π½Ρ

// Π² Windows-95 вСрсии 4.00.950a, Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ для России, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

// Ссли всС ΠΆΠ΅ Π½Π΅Ρ‚, Ρ‚ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ посрСдством GetLogicalDrives

// которая Ρ‚ΠΎΡ‡Π½ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎ Π²ΡΠ΅Ρ… рСализациях Win32

n = GetLogicalDrives ();

// ΡƒΠ·Π½Π°Π΅ΠΌ, сколько всСго устройств

count = 0;

for (i = 1; i; i <<= 1) if (n & i) count++;

// Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ строку с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ устройств

temp = new char [ count * 4 + 1 ];

if (temp) {

p = temp;

for (i = 0; i < 32; i ++) if (n & (1L << i)) {

*p++ = (char)('A' + i); *p++ = ':'; *p++ = '\'; *p++ = '';}

*p++ = '';}

} else {

// Ссли функция GetLogicalDriveStrings Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π΅

temp = new char [ n + 1 ];

if (temp) GetLogicalDriveStrings (n, temp);

}

if (temp) {

// ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний ΠΎ ΠΊΡ€ΠΈΡ‚ичСской ошибкС

errmode = SetErrorMode (SEM_FAILCRITICALERRORS);

// Ссли строка ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°, Ρ‚ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Π΅Π΅ ΠΏΠΎ Ρ‡Π°ΡΡ‚ям

for (p = temp; *p; p += lstrlen (p) + 1) {

wsprintf (buffer, «Root: %s», p);

switch (GetDriveType (p)) {

case 0: s = «???»; break;

case 1: s = «invalid»; break;

case DRIVE_REMOVABLE: s = «REMOVABLE»; break;

case DRIVE_FIXED: s = «FIXED»; break;

case DRIVE_REMOTE: s = «REMOTE»; break;

case DRIVE_CDROM: s = «CD-ROM»; break;

case DRIVE_RAMDISK: s = «RAM DISK»; break;

default: s = «what?!»; break;}

// ΡƒΠΊΠ°ΠΆΠ΅ΠΌ явноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ указатСля Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ `s' ΠΊ Ρ‚ΠΈΠΏΡƒ

// LPSTR — Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Windows API для ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ памяти с ΠΎΠ΄Π½ΠΈΠΌ сСгмСнтом

// Π΄Π°Π½Π½Ρ‹Ρ… (tiny, small, medium) ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 16-Ρ‚ΠΈ разрядныС

// Π° Π΄Π»Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Windows ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½Ρ‹ 32-Ρ… разрядныС

wsprintf (buffer+lstrlen (buffer), «type=%s volume='», (LPSTR)s);

sernum = complen = flags = 0; file_system[0] = '';

if (

GetVolumeInformation (

p, buffer+lstrlen (buffer), 64,

&sernum, &complen, &flags,

file_system, sizeof (file_system)))

{// Ссли информация ΠΎ Ρ‚ΠΎΠΌΠ΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π° -> ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π±ΠΎΠ»Π΅Π΅

// ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ свСдСния

wsprintf (buffer+lstrlen (buffer), «' serial=%08lXrn», sernum);

_lwrite (hf, buffer, lstrlen (buffer));

spc = bps = fc = tc = 0L;

GetDiskFreeSpace (p, &spc, &bps, &fc, &tc);

bps *= spc;

wsprintf (

buffer,

" comp. length=%lu cluster=%lu total=%luK free=%luKrn" ,

complen, bps, bps*tc/1024, bps*fc/1024);

_lwrite (hf, buffer, lstrlen (buffer));

wsprintf (buffer, «file system ='%s' flags=», file_system);

s = buffer + lstrlen (buffer);

if (flags & FS_CASE_IS_PRESERVED) {

lstrcpy (s, «CASE_PRESERVED «); s+= lstrlen (s);}

if (flags & FS_CASE_SENSITIVE) {

lstrcpy (s, «CASE_SENSITIVE «); s+= lstrlen (s);}

if (flags & FS_UNICODE_STORED_ON_DISK) {

lstrcpy (s, «UNICODE «); s+= lstrlen (s);}

if (flags & FS_PERSISTENT_ACLS) {

lstrcpy (s, «ACL «); s+= lstrlen (s);}

if (flags & FS_FILE_COMPRESSION) {

lstrcpy (s, «MAY_COMPRESS «); s+= lstrlen (s);}

if (flags & FS_VOL_IS_COMPRESSED) {

lstrcpy (s, «COMPRESSED «); s+= lstrlen (s);}

lstrcpy (s, «rn»);

_lwrite (hf, buffer, lstrlen (buffer));

} else {

// Ссли информация ΠΎ Ρ‚ΠΎΠΌΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°, Ρ‚ΠΎ ΠΏΡ€ΠΎΡΡ‚ΠΎ сообщаСм

lstrcpy (

buffer+lstrlen (buffer),

" ' ***** NO VOLUME INFORMATION! rn");

_lwrite (hf, buffer, lstrlen (buffer));}}

delete temp;

// восстанавливаСм Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ критичСских ошибок

SetErrorMode (errmode);} else {

// Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка (Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ памяти для получСния списка устройств)

// Ρ‚ΠΎ ΠΏΡ€ΠΎΡΡ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ тСкст с ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ Π½Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π½Π΅

// Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° досрочно

_lwrite (hf, «NOT ENOUGHT MEMORY TO GET INFORMATION! rn», 40);}

// пишСм Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ

_lwrite (hf, «rn******** READ DOS DEVICES MAP ********rnrn», 44);

// просто для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ Z: ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, содСрТащий win.com

GetWindowsDirectory (buffer, sizeof (buffer));

SetLastError (ERROR_SUCCESS);

DefineDosDevice (0, devZ, buffer);

if (GetLastError () ≠ ERROR_SUCCESS) {

// функция DefineDosDevice Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° — это Π½Π΅ Windows NT!

_lwrite (hf, «NOTE: DefineDosDevice () is not implemented! rn», 45);

} else {

// Ссли Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΎΡΡŒ — это NT, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ

// хотя ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Windows 98

buffer[ QueryDosDevice (NULL, buffer, 1024) ] = `';

// функция QueryDosDevice Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число символов, скопированных Π² Π±ΡƒΡ„Π΅Ρ€

// ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ Windows 98 ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 0, хотя сам Π±ΡƒΡ„Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ мусор.

for (p = buffer; *p; p += lstrlen (p) + 1) {

_lwrite (hf, ««, 15 — lstrlen (p));

_lwrite (hf, p, lstrlen (p));

_lwrite (hf, «= «, 3);

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ массив file_system Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ строки

QueryDosDevice (p, file_system, sizeof (file_system));

_lwrite (hf, file_system, lstrlen (file_system));

_lwrite (hf, «rn», 2);}

GetWindowsDirectory (buffer, sizeof (buffer));

// удаляСм Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π°ΠΌΠΈ устройство

DefineDosDevice (

DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, «Z:», buffer);}

// ΡƒΠ·Π½Π°Π΅ΠΌ Π΄Π»ΠΈΠ½Ρƒ Ρ„Π°ΠΉΠ»Π° с Ρ‚Скстом ΠΈ Π²Ρ‹Π΄Π΅Π»ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π±Π»ΠΎΠΊ памяти

n = _llseek (hf, 0L, 1);

temp = new char [ (int)n + 1 ];

if (temp) {

// Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ символ `'

_llseek (hf, 0L, 0);

temp[ _lread (hf, temp, (int)n) ] = '';

// ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½Ρƒ просмотра

SetWindowText (hwndView, temp);

// наш Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½

delete temp;

} else {

// Ссли памяти Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ — сообщаСм

SetWindowText (hwndView, «*** Cannot load text ***»);}

// Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ ΡƒΠ΄Π°Π»ΡΠ΅ΠΌ Π΅Π³ΠΎ — систСма сама этого Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ‚

_lclose (hf);

OpenFile (tempfile, &ofs, OF_DELETE);

return TRUE;}

void Cls_OnSize (HWND hwnd, UINT state, int cx, int cy)

{UNUSED_ARG (state);

// ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° мСняСм Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π° просмотра

HWND hwndView = (HWND)GetWindowLong (hwnd, 0); if (IsWindow (hwndView)) MoveWindow (hwndView, 0,0, cx, cy, TRUE);}

void Cls_OnDestroy (HWND hwnd)

{// ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π΅ (Π»ΡƒΡ‡ΡˆΠ΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ

// самим, хотя Π² ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС систСма это сдСлаСт Π·Π° Π²Π°Ρ)

HWND hwndView = (HWND)GetWindowLong (hwnd, 0);

if (IsWindow (hwndView)) DestroyWindow (hwndView);

PostQuitMessage (0);}

void Cls_OnSetFocus (HWND hwnd, HWND hwndOldFocus)

{UNUSED_ARG (hwndOldFocus);

// ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ фокуса Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ — Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ просмотра, Ρ‡Ρ‚ΠΎ Π±Ρ‹

// Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°

HWND hwndView = (HWND)GetWindowLong (hwnd, 0);

if (IsWindow (hwndView)) SetFocus (hwndView);}

LONG WINAPI _export WinProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{switch (uMsg) {

HANDLE_MSG (hWnd, WM_CREATE, Cls_OnCreate);

HANDLE_MSG (hWnd, WM_DESTROY, Cls_OnDestroy);

HANDLE_MSG (hWnd, WM_SIZE, Cls_OnSize);

HANDLE_MSG (hWnd, WM_SETFOCUS, Cls_OnSetFocus);

default: break;}

return DefWindowProc (hWnd, uMsg, wParam, lParam);}

static BOOL init_instance (HINSTANCE hInstance)

{WNDCLASS wc;

wc.style = 0;

wc.lpfnWndProc = WinProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 4; // для Ρ…Π΅Π½Π΄Π»Π° ΠΎΠΊΠ½Π° просмотра

wc.hInstance = hInstance;

wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor (NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

wc.lpszMenuName = NULL;

wc.lpszClassName = szWndClass;

return RegisterClass (&wc) == NULL? FALSE: TRUE;}

int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)

{UNUSED_ARG (lpszCmdLine);

MSG msg;

HWND hWnd;

if (!hPrevInst) {

if (!init_instance (hInst)) return 1;}

hWnd= CreateWindow (

szWndClass, // class name

" window header", // window name

WS_OVERLAPPEDWINDOW, // window style

CW_USEDEFAULT, CW_USEDEFAULT, // window position

CW_USEDEFAULT, CW_USEDEFAULT, // window size

NULL, // parent window

NULL, // menu

hInst, // current instance

NULL // user-defined parameters);

if (!hWnd) return 1;

ShowWindow (hWnd, nCmdShow);

UpdateWindow (hWnd);

while (GetMessage (&msg, NULL, NULL, NULL)) {

TranslateMessage (&msg);

DispatchMessage (&msg);}

return msg. wParam;}

Π€Π°ΠΉΠ» 2B16. CPP

// Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ описания Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

#include

#include

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetLastError ΠΈ SetLastError Π½Π΅ ΠΎΠΏΠΈΡΠ°Π½Ρ‹ Π² Windows API, эмулируСм ΠΈΡ…

#define ERROR_SUCCESS 0

static int error_code = ERROR_SUCCESS;

int GetLastError (void)

{return error_code;}

int SetLastError (int err)

{int prev = error_code; return error_code = err;}

// функция GetLogicalDriveStrings Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Windows API, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… // рСализациях Win32 ΠΎΠ½Π° прСдставлСна Π·Π°Π³Π»ΡƒΡˆΠΊΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΈ ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌ

int GetLogicalDriveStrings (DWORD size, char* buf)

{UNUSED_ARG (size);

UNUSED_ARG (buf);

SetLastError (1);

return 0;}

// функция GetLogicalDrives Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Windows API, Π½ΠΎ Π½Π°ΠΌ ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π°

// для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния — эмулируСм Π΅Π΅

DWORD GetLogicalDrives (void)

{DWORD dwDevices = 0L;

unsigned n, uTotal, uCurrent, uTest;

// Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ устройство

_dos_getdrive (&uCurrent);

_dos_setdrive (uCurrent, &uTotal);

for (n = 1; n <= uTotal; n++) = 1L << (n -1);

// восстанавливаСм ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ устройство

_dos_setdrive (uCurrent, &uTotal);

return dwDevices;}

// функция GetDriveType Π² Win32 API Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° нСсколько ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Π² Windows;

// ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Win32 API UINT GetDriveType (LPSTR) Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

// Windows API UINT GetDriveType (UINT), Π·Π°ΠΎΠ΄Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΏΠ°Ρ€Ρƒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΡ… // символов

#ifndef DRIVE_CDROM

#define DRIVE_CDROM 5

#endif

#ifndef DRIVE_RAMDISK

#define DRIVE_RAMDISK 6

#endif

UINT GetDriveType (char* pRoot)

{char c;

if (pRoot) {

c = (char)AnsiUpper ((LPSTR)(DWORD)(UINT)(unsigned char)(pRoot[ 0 ]));

if (c >= 'A' && c <= 'Z') return GetDriveType (c — 'A');}

return 0;}

// функция GetVolumeInformation Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Windows API. Π­ΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π΅ // Π² ΡΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π·Π°ΠΎΠ΄Π½ΠΎ опрСдСляСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ символы.

#define FS_CASE_IS_PRESERVED 1

#define FS_CASE_SENSITIVE 2

#define FS_UNICODE_STORED_ON_DISK 4

#define FS_PERSISTENT_ACLS 16

#define FS_FILE_COMPRESSION 32

#define FS_VOL_IS_COMPRESSED 64

BOOL GetVolumeInformation (

char *pRoot, char* pVolume, int cbVolume,

DWORD *sernum, DWORD *complen, DWORD *flags,

char *pFS, int cbFS)

{BOOL fReturnCode = FALSE;

char c;

unsigned uDrive, uCurrent, n;

UNUSED_ARG (cbVolume);

UNUSED_ARG (cbFS);

if (pRoot) {

c= (char)AnsiUpper ((LPSTR)(DWORD)(UINT)(unsigned char)(pRoot[ 0 ]));

if (c >= 'A' && c <= 'Z') {

uDrive = (unsigned)(c — 'A' + 1);

_dos_getdrive (&uCurrent);

_dos_setdrive (uDrive, &n);

_dos_getdrive (&n);

if (uDrive == n) {// убСдимся, Ρ‡Ρ‚ΠΎ устройство ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ

// строго говоря всС это стоит ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½Π΅Π΅:

pVolume[0] = '';

*sernum = 0L;

*complen = 12;

*flags = (long)FS_CASE_IS_PRESERVED;

pFS = '';

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ доступ ΠΊ ΡƒΡΡ‚ройству — Ссли ΠΌΡ‹ Π²Π΅Ρ€Π½Π΅ΠΌ

// TRUE, Ρ‚ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ Π½Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ прСдпринята ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡƒΠ·Π½Π°Ρ‚ΡŒ

// Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΠΌΠ°

if (!access (pRoot, F_OK)) fReturnCode = TRUE;}

// восстановим Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ устройство

_dos_setdrive (uCurrent, &n);}}

return fReturnCode;}

// функция GetDiskFree Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Windows API, эмулируСм Π΅Π΅ ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ _dos_getdiskfree стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

void GetDiskFreeSpace (char* pRoot, DWORD* spc, DWORD* bps, DWORD* fc, DWORD* tc)

{char c;

diskfree_t df;

if (pRoot) {

c = (char)AnsiUpper ((LPSTR)(DWORD)(UINT)(unsigned char)(pRoot[ 0 ]));

if (c >= 'A' && c <= 'Z') {

if (!_dos_getdiskfree (c — 'A' + 1, &df)) {

*spc = df. sectors_per_cluster;

*bps = df. bytes_per_sector;

*fc = df. avail_clusters;

*tc = df. total_clusters;}}}}

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DefineDosDevice ΠΈ QueryDosDevice Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Windows API.

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ вмСсто Π½ΠΈΡ… Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для NT

#define DDD_REMOVE_DEFINITION 1

#define DDD_EXACT_MATCH_ON_REMOVE 2

BOOL DefineDosDevice (DWORD dwFlags, LPSTR lpDosDevice, LPSTR lpPath)

{UNUSED_ARG (dwFlags);

UNUSED_ARG (lpDosDevice);

UNUSED_ARG (lpPath);

SetLastError (1);

return FALSE;}

DWORD QueryDosDevice (LPSTR lpDosDevice, LPSTR lpPath, DWORD ucchMax)

{UNUSED_ARG (lpDosDevice);

UNUSED_ARG (lpPath);

UNUSED_ARG (ucchMax);

SetLastError (1);

return 0L;}

РСзюмС Π›ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… — для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌΠ°Ρ… ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΠΌ пространствС прСдпринимаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° чтСния с ΡƒΡΡ‚ройства. Однако Ρ‚ΠΎΠΌ Π² ΡƒΡΡ‚ройствС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ вовсС — Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ дискСты. Π Π°Π·Π½Ρ‹Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° Ρ‚Π°ΠΊΠΎΠ΅ событиС Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ — Windows-95, ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΌΠ° Π½Π΅Ρ‚, просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»ΠΈ, Π° Windows NT ΠΈΠ»ΠΈ Windows 3. x Π²Ρ‹Π΄Π°ΡŽΡ‚ сообщСниС ΠΎ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΠΎΠΉ ошибкС.

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ примСняСтся функция SetErrorMode, которая позволяСт ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ сообщСний ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ чтСния с Π΄ΠΈΡΠΊΠ°. Π›ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ часто ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ эта функция для Win32 API Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для RISC процСссоров — странно, Π½ΠΎ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Intel Pentium ΠΎΠ½Π° Ρ‚ΠΎΠΆΠ΅ сработала. Π’ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡΡ… ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ тСста рСакция систСмы Π½Π° ΠΊΡ€ΠΈΡ‚ичСскиС ошибки приводится Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ эта функция Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ся. На ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (с ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetErrorMode) сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2B Π±Ρ‹Π»ΠΎ протСстировано Π½Π° 2Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…:

А) ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ с Windows-95 РСально тСстированиС ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π΅Ρ‰Π΅ ΠΈ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ с ΡΠΈΡΡ‚Π΅ΠΌΠΎΠΉ Windows-98, ΠΎΠ΄Π½Π°ΠΊΠΎ Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°Π»ΠΎΡΡŒ ΠΎΡ‚ Windows-95, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ нюанса Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ DefineDosDevice ΠΈ QueryDosDevice. ΠΈ Windows 3.11 + Win32s

диск A — 3.5″, дискСта Π½Π΅ Π²ΡΡ‚Π°Π²Π»Π΅Π½Π° диск C — EIDE HDD, Ρ‚ΠΎΠΌ «Bootable»

диск D — SCSI HDD, ΠΏΠΎΠ΄ Windows 3.11 доступСн Ρ‡Π΅Ρ€Π΅Π· ASPI Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Ρ‚ΠΎΠΌ «SCSI_VOL»

диск E — IDE CD-ROM, диск Π½Π΅ Π²ΡΡ‚Π°Π²Π»Π΅Π½ Π‘) ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ с Windows NT

диск A — 3.5″, дискСта Π½Π΅ Π²ΡΡ‚Π°Π²Π»Π΅Π½Π° диск C — SCSI HDD,

диск D — IDE CD-ROM, диск Π½Π΅ Π²ΡΡ‚Π°Π²Π»Π΅Π½ ВсСго Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ 6 тСстов — Π·Π°ΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ 16Ρ‚ΠΈ ΠΈ 32Ρ… разрядныС вСрсии прилоТСния Π² ΡΡ€Π΅Π΄Π΅ Windows 3.11 + Win32s, Windows-95 ΠΈ Windows NT Server 4.0. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстов ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

Π‘Ρ€Π΅Π΄Π° Windows 3.11+Win32s, 16Ρ‚ΠΈ разрядноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

******** GET VOLUME INFORMATION ********

Root: A: type=REMOVABLE volume='' ***** NO VOLUME INFORMATION!

Root: C: type=FIXED volume='' serial=0

maximal component length=12 cluster=16 384 total=82 2272K free=71712K

file system ='' flags=CASE_PRESERVED

Root: D: type=FIXED volume='' serial=0

maximal component length=12 cluster=32 768 total=106 5792K free=45408K

file system ='' flags=CASE_PRESERVED

Root: E: type=REMOTE volume='' ***** NO VOLUME INFORMATION!

******** READ DOS DEVICES MAP ********

NOTE: DefineDosDevice () is not implemented!

16Ρ‚ΠΈ разрядноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ пытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄ΠΈΡΠΊΠ°ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ access (Π² ΡΠΌΡƒΠ»ΡΡ†ΠΈΠΈ GetVolumeInformation), Ρ‡Ρ‚ΠΎ для дисков A (Π³ΠΈΠ±ΠΊΠΈΠΉ диск) ΠΈ E (CD-ROM) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ «Cannot read from drive …»;

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ CD-ROM распознаСтся ΠΊΠ°ΠΊ сСтСвоС устройство.

Π‘Ρ€Π΅Π΄Π° Windows 3.11+Win32s, 32Ρ… разрядноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

******** GET VOLUME INFORMATION ********

Root: A: type=REMOVABLE volume='' ***** NO VOLUME INFORMATION!

Root: C: type=FIXED volume='BOOTABLE' serial=0

maximal component length=12 cluster=16 384 total=82 2272K free=71728K

file system ='FAT' flags=

Root: D: type=RAM DISK volume='SCSI_VOL' serial=0

maximal component length=12 cluster=32 768 total=106 5792K free=45408K

file system ='FAT' flags=

Root: E: type=CD-ROM volume='SCSI_VOL' serial=0

maximal component length=12 cluster=0 total=0K free=0K

file system ='FAT' flags=

******** READ DOS DEVICES MAP ********

NOTE: DefineDosDevice () is not implemented!

РСакция прилоТСния ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ другая (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, входящиС Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Win32 API, Π° Π½Π΅ ΠΈΡ… эмуляция нашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ).

ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π΄ΠΈΡΠΊΡƒ A Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ся сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅, ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π΄ΠΈΡΠΊΡƒ E (CD-ROM) функция GetVolumeInformation (ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π² Win32s, Π° Π½Π΅ Π΅Π΅ эмуляция Ρƒ Π½Π°Ρ) Π΄Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ информация ΠΎ Ρ‚ΠΎΠΌΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ (?!) ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°, послС Ρ‡Π΅Π³ΠΎ слСдуСт ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡƒΠ·Π½Π°Ρ‚ΡŒ свободноС пространство Π½Π° ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ дискС E — с Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ сообщСниСм ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ (вмСсто сообщСния «no volume information»).

Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ диска E — CD-ROM — ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, файловая систСма — CDFS (файловая систСма CD дисков) ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ распознана ΠΊΠ°ΠΊ FAT, Π° ΠΌΠ΅Ρ‚ΠΊΡƒ Ρ‚ΠΎΠΌΠ° позаимствовали Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ диска Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎ для MSCDEX. EXE, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт доступ ΠΊ Π΄ΠΈΡΠΊΠ°ΠΌ с CDFS Π² ΡΡ€Π΅Π΄Π΅ MS-DOS; ΠΏΡ€ΠΈ отсутствии диска MSCDEX часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² ΠΊΡΡˆΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ диска, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρ€Π°Π½ΡŒΡˆΠ΅ вставлСн, Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎ, кстати, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΎΡˆΠΈΠ±ΠΊΠ΅ — ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π° Ρ‚ΠΎΠΌΠ΅ с CDFS Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚, Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΎΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ отсутствуСт Π² ΠΏΡ€ΠΈΠ²ΠΎΠ΄Π΅! ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ наличия Ρ„Π°ΠΉΠ»Π° Π½Π° CD-ROM Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΡ€ΠΎΡΡ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅, Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ присутствии Ρ„Π°ΠΉΠ»Π°.

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