/* ΠΠ»Π°Π²Π° 4. ΠΠΎΠΌΠ°Π½Π΄Π° toupper. */
/* ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Π²ΡΠ΅Ρ Π±ΡΠΊΠ² Π½Π° ΠΏΡΠΎΠΏΠΈΡΠ½ΡΠ΅. ΠΠΌΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π½Π΅ΠΌΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠ° UC_. */
#include "EvryThng.h"
int _tmain(DWORD argc, LPTSTR argv[]) {
HANDLE hIn = INVALID_HANDLE_VALUE, hOut = INVALID_HANDLE_VALUE;
DWORD FileSize, nXfer, iFile, j;
CHAR OutFileName [256] = "", *pBuffer = NULL;
OVERLAPPED ov = {0, 0, 0, 0, NULL}; /* ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ². */
if (argc <= 1) ReportError(_T("ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: toupper ΡΠ°ΠΉΠ»Ρ"), 1, FALSE);
/* ΠΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅. */
for (iFile = 1; iFile < argc; iFile++) __try { /* ΠΠ»ΠΎΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. */
/* ΠΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Ρ, pBuffer == NULL, Π° ΡΠ°ΠΉΠ» OutFileName ΠΏΡΡΡ. ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ. */
_stprintf(OutFileName, "UC_%s", argv[iFile]);
__try { /* ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠΉ Π±Π»ΠΎΠΊ try-finally. */
/* ΠΡΠΈΠ±ΠΊΠ° Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΠ°Π³Π΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ */
/* ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ "ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°". */
/* ΠΠ±ΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΎΡΠΈΡΡΠΊΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ */
/* ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°. */
/* Π‘ΠΎΠ·Π΄Π°ΡΡ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ» (Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ). */
hIn = CreateFile(argv[iFile], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hIn == INVALID_HANDLE_VALUE) ReportException(argv[iFile], 1);
FileSize = GetFileSize(hIn, NULL);
hOut = CreateFile(OutFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
if (hOut == INVALID_HANDLE_VALUE) ReportException(OutFileName, 1);
/* Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π°. */
pBuffer = malloc(FileSize);
if (pBuffer == NULL) ReportException(_T("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ"), 1);
/* ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±Π° ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠΏΠΈΠΈ. */
if (!LockFileEx(hIn, LOCKFILE_FAIL_IMMEDIATELY, 0, FileSize, 0, &ov) ReportException(_T("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°"), 1);
if (!LockFileEx(hOut, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0, FileSize, 0, &ov) ReportException(_T("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° "), 1);
/* Π‘ΡΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ». */
/* ΠΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ ΡΠ΅ΡΡΡΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ */
/* ΠΎΡΠΈΠ±ΠΊΠΈ; ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ». */
if (!ReadFile(hIn, pBuffer, FileSize, &nXfer, NULL)) ReportException(_T("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π°"), 1);
for (j = 0; j < FileSize; j++) /* ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅. */
if (isalpha(pBuffer [j])) pBuffer[j] = toupper(pBuffer [j]);
if(WriteFile(hOut, pBuffer, FileSize, &nXfer, NULL)) ReportException(T("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ»"), 1);
} __finally {
/*ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, Π·Π°ΠΊΡΡΡΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΡΠ°ΠΉΠ»ΠΎΠ²,*/
/*ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½Π°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ */
/*Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. */
if (pBuffer != NULL) free (pBuffer);
pBuffer = NULL;
if (hIn != INVALID_HANDLE_VALUE) {
UnlockFileEx(hIn, 0, FileSize, 0, &ov);
CloseHandle(hIn);
hIn = INVALID_HANDLE_VALUE;
}
if (hOut != INVALID_HANDLE_VALUE) {
UnlockFileEx(hOut, 0, FileSize, 0, &ov);
CloseHandle(hOut);
hOut = INVALID_HANDLE_VALUE;
}
_tcscpy(OutFileName, _T(""));
}
}
/* ΠΠΎΠ½Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π±Π»ΠΎΠΊΠ° try. */
/* ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΠ΅Π»Π° ΡΠΈΠΊΠ»Π°. */
__except(EXCEPTION_EXECUTE_HANDLER) {
_tprintf(_T("ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ°ΠΉΠ»Π° %s\n"), argv[iFile]);
DeleteFile (OutFileName);
}
_tprintf(_T("ΠΠ±ΡΠ°Π±ΠΎΡΠ°Π½Ρ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΡΠΎΠΌΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π²ΡΡΠ΅ \n"));
return 0;
}
ΠΡΠΈΠΌΠ΅Ρ: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠ»ΡΡΡΠ°
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.3 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠ°ΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΡΡΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΠ»ΡΡΡΠ°. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΈΠ»ΡΡΡΠ° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ; Π²ΡΠ±ΠΎΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ², ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, Π±ΡΠ» ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ»ΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π»ΡΠΌΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ ΠΎΠ±Π»Π°ΡΡΡΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ Π°Π΄ΡΠ΅ΡΠ° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅.
ΠΠ»ΠΎΠΊ __finally Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠ°ΡΠΊΠΈ FP-ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΌΠ°ΡΠΊΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ, ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ, Π½ΠΎ ΡΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ Π½Π°ΠΌ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΄Π°Π»ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΡΡΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ (Π³Π»Π°Π²Π° 8) ΠΈ ΠΎΡΠΌΠ΅Π½ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² (Π³Π»Π°Π²Ρ 3 ΠΈ 6). Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΈΠ»ΡΡΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 4.4.
ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΏΡΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ; ΡΡΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π³Π»Π°Π²Π΅ 5.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.3. Exception: ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ#include "EvryThng.h"
#include <float.h>
DWORD Filter(LPEXCEPTION_POINTERS, LPDWORD);
double x = 1.0, Ρ = 0.0;
int _tmain(int argc, LPTSTR argv[]) {
DWORD ECatgry, i = 0, ix, iy = 0;
LPDWORD pNull = NULL;
BOOL Done = FALSE;
DWORD FPOld, FPNew;
FPOld = _controlfp(0, 0); /* Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΡΠ°ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΠΌΠ°ΡΠΊΡ. */
/* Π Π°Π·ΡΠ΅ΡΠΈΡΡ FP-ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. */
FPNew = FPOld & ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE | EM_DENORMAL | EM_INVALID);
_controlfp(FPNew, MCW_EM);
while (!Done) _try { /* ΠΠ»ΠΎΠΊ try-finally. */
_tprintf(_T("ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠΈΠΏ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: "));
_tprintf(_T(" 1: Mem, 2: Int, 3: Flt 4: User 5: __leave "));
_tscanf(_T("%d"), &i);
__try { /* ΠΠ»ΠΎΠΊ try-except. */
switch (i) {
case 1: /* ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ. */
ix = *pNull;
*pNull = 5;
break;
case 2: /* ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ. */
ix = ix / iy;
break;
case 3: /* FP-ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. */
x = x / Ρ;
_tprintf(_T("x = %20e\n"), x);
break;
case 4: /* ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. */
ReportException(_T("ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅"), 1);
break;
case 5: /* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ _leave Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.*/
__leave;
default:
Done = TRUE;
}
} /* ΠΠΎΠ½Π΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ° __try. */
__except(Filter(GetExceptionInformation(), &ECatgry)) {
switch(ECatgry) {
case 0:
_tprintf(_T("ΠΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅\n"));
break;
case 1:
_tprintf(_T("ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ\n"));
continue;
case 2:
_tprintf(_T("ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ \n"));
break;
case 3:
_tprintf(_Π’("FΠ -ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅\n"));
_clearfp();
break;
case 10:
_tprintf(_T("ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅\n"));
break;
default:
_tprintf(_T("ΠΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅\n"));
break;
} /* ΠΠΎΠ½Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° switch. */
_tprintf(_Π’("ΠΠΎΠ½Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°\n"));
}
/* ΠΠΎΠ½Π΅Ρ Π±Π»ΠΎΠΊΠ° try-except. */
} /* ΠΠΎΠ½Π΅Ρ ΡΠΈΠΊΠ»Π° while β Π½ΠΈΠΆΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ. */
__finally { /* ΠΡΠΎ ΡΠ°ΡΡΡ ΡΠΈΠΊΠ»Π° while. */
_tprintf(_T("ΠΠ²Π°ΡΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅?: %d\n"),
AbnormalTermination());
}
_controlfp(FPOld, 0xFFFFFFFF); /* ΠΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΠ°ΡΡΡ FP-ΠΌΠ°ΡΠΊΡ.*/
return 0;
}
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.4 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΈΠ»ΡΡΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 4.3. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄ΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠΌ Π½Π° Web-ΡΠ°ΠΉΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π»ΠΈΡΡ ΡΠ΅Ρ ΠΈΠ· Π½ΠΈΡ , ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 4.4. Π€ΡΠ½ΠΊΡΠΈΡ Filterstatic DWORD Filter(LPEXCEPTION_POINTERS pExP, LPDWORD ECatgry)
/* ΠΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π²ΡΠ±ΠΎΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. */
{
DWORD ExCode, ReadWrite, VirtAddr;
ExCode = pExP->ExceptionRecord->ExceptionCode;
_tprintf(_T("Filter. ExCode:. %x\n"), ExCode);
if ((0x20000000 & ExCode) != 0) { /* ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. */
*ECatgry =10;
return EXCEPTION_EXECUTE_HANDLER;
}
switch (ExCode) {
case EXCEPTION_ACCESS_VIOLATION:
ReadWrite = /* ΠΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ? */
pExP->ExceptionRecord->ExceptionInformation[0];
VirtAddr = /* ΠΠ΄ΡΠ΅Ρ ΡΠ±ΠΎΡ Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΌΡΡΠΈ. */