Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Петзолд Ч. Программирование для Windows 95 [22].pdf
Скачиваний:
76
Добавлен:
02.05.2014
Размер:
3.02 Mб
Скачать

86

На рис. 15.10 показана правильная последовательность вызовов функций печати при печати многостраничного документа. Проверять, что значение переменной bUserAbort равно TRUE, лучше после каждого вызова функции EndPage. Функция EndDoc используется только тогда, когда предыдущие функции печати отработали без ошибок. На самом деле, при получении ошибки при вызове любой из показанных выше функций печати, печать прекращается.

Обработка кодов ошибок

До сих пор мы обрабатывали возвращаемые значения функций печати относительно просто: если функция печати (например, StartDoc) возвращает отрицательное значение, значит имеет место ошибка, и операция печати прерывается. Отрицательный код ошибки равен SP_ERROR (—1), и это единственное возвращаемое значение функций печати Win32, которое показывает наличие ошибки. Само по себе значение SP_ERROR о многом не говорит.

Более точно сообщить пользователю об ошибке можно с помощью функции GetLastError, вызывая ее сразу после ошибки. Если вызвать функцию GetLastError после того, как функция печати возвращает ошибку, то ее возвращаемым значением будет один из пяти возможных идентификаторов, которые определяются в файле WINGDI.H. Кроме них в файле WINGDI.H имеется идентификатор SP_NOTREPORTED, его значение равно 0х4000. Если результат поразрядной операции AND возвращаемого значения функции GetLastError и идентификатора SP_NOTREPORTED равен 0, то значит пользователь уже получил сообщение об ошибке. Результат поразрядной операции OR возвращаемого значения функции GetLastError и идентификатора SP_NOTREPORTED можно сравнить с пятью идентификаторами кодов ошибки для определения того, было ли уже выведено сообщение об ошибке или нет.

Следующий фрагмент программы показывает один из методов получения строки текста, идентифицирующей ошибку. Предполагается, что если возвращаемое значение функции печати отрицательно, то флаг bError устанавливается в TRUE. В представленном фрагменте этот флаг проверяется и, если имела место ошибка, вызывается функция _GetErrorText. Затем пользователю выводится окно сообщения об ошибке. Если пользователь к этому времени уже получил сообщение об ошибке, то возвращаемым значением функции _GetErrorText является

NULL:

if( bError == TRUE )

{

pszErrMsg = _GetErrorText();

if(pszErrMsg) MessageBox(hwnd, pszErrMsg, NULL, MB_OK);

}

LPCTSTR _GetErrorText(void)

{

static LPCTSTR pszErrorText[] = { "General error", "Canceled from program", "Canceled by user", "Out of disk space", "Out of memory" };

DWORD dwError = GetLastError();

if((dwError & SP_NOTREPORTED) == 0) return NULL;

return pszErrorText[~dwError];

}

Далее приведены пять кодов ошибок с описанием возможных причин:

SP_ERROR (0xFFFF или -1) — определяется как "general error" (общая ошибка). Это единственный код ошибки, являющийся возвращаемым значением функций печати в Win32. Он показывает, что модуль GDI или драйвер принтера не могут начать печать документа.

SP_APPABORT (0xFFFE или -2) — этот код, как определено в документации, показывает, что процедура прерывания программы возвратила значение FALSE. Однако, это работает только при отключенном спулере. Если спулер работает, и если процедуре прерывания передается параметр iCode равный 0, а она возвращает значение FALSE, то возвращаемое значение функции EndPage будет положительно.

SP_USERABORT (0xFFFD или -3) — этот код показывает, что пользователь отказался от задания на печать из окна папки Printers.

SP_OUTOFDISK (0xFFFC или -4) — этот код показывает отсутствие свободного дискового пространства. Такой код ошибки появляется в том случае, если жесткий диск, на котором находится подкаталог TEMP, не может вместить ни одного временного файла спулера. Если в подкаталоге TEMP уже имеется