Примечание
Коды программ, находящиеся на Web-сайте книги, содержат подробные комментарии и тщательно документированы, тогда как в самой книге большинство комментариев с целью сокращения места были опущены, и основное внимание в ней уделяется использованию Windows.
Следует также отметить, что в примере вводится заголовочный файл Envirmnt.h (его код приведен в приложении А и предоставлен на Web-сайте книги), который должен использоваться совместно со всеми приводимыми в книге программами. Этот файл содержит определения символических констант UNICODE и _UNICODE (сами определения "закомментированы"; при компоновке приложений, предназначенных для работы с символами стандарта Unicode, символы комментариев следует удалить), а также необходимых макропеременных, учитывающих особенности окружения. В заголовочных файлах, находящихся на Web-сайте, определены также дополнительные модификаторы, которые обеспечивают импортирование и экспортирование имен функций, а также гарантируют соблюдение соответствующих соглашений о вызове функций.
/* PrintMsg.с: ConsolePrompt, PrintStrings, PrintMsg */
#include "Envirmnt.h" /* В этом файле устанавливаются директивы #define и #undef для UNICODE. */
#include
#include
BOOL PrintStrings (HANDLE hOut, ...)
/* Запись сообщений в буфер экрана консоли. */
{
DWORD MsgLen, Count;
LPCTSTR pMsg;
va_list pMsgList; /* Строка текущего сообщения. */
va_start (pMsgList, hOut); /* Начать обработку сообщений. */
while ((pMsg = va_arg(pMsgList, LPCTSTR)) != NULL) {
MsgLen = _tcslen(pMsg);
/* Функция WriteConsole может применяться только с дескриптором буфера экрана консоли. */
if (!WriteConsole(hOut, pMsg, MsgLen, &Count, NULL)
/* Функция WriteFile вызывается только в случае неудачного завершения функции WriteConsole. */
&& !WriteFile(hOut, pMsg, MsgLen * sizeof (TCHAR), &Count, NULL)) return FALSE;
}
va_end(pMsgList);
return TRUE;
}
BOOL PrintMsg(HANDLE hOut, LPCTSTR pMsg)
/* Версия PrintStrings для вывода одиночного сообщения. */
{
return PrintStrings(hOut, pMsg, NULL);
}
BOOL ConsolePrompt(LPCTSTR pPromptMsg, LPTSTR pResponse, DWORD MaxTchar, BOOL Echo)
/* Вывести на консоль подсказку для пользователя и получить от него ответ. */
{
HANDLE hStdIn, hStdOut;
DWORD TcharIn, EchoFlag;
BOOL Success;
hStdIn = CreateFile(_T("CONIN$"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
hStdOut = CreateFile(_T("CONOUT$"), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
EchoFlag = Echo ? ENABLE_ECHO_INPUT : 0;
Success = SetConsoleMode(hStdIn, ENABLE_LINE_INPUT | EchoFlag | ENABLE_PROCESSED_INPUT) &&
SetConsoleMode (hStdOut, ENABLE_WRAP_AT_EOL_OUTPUT | ENABLE_PROCESSED_OUTPUT) &&
PrintStrings (hStdOut, pPromptMsg, NULL) &&
ReadConsole (hStdIn, pResponse, MaxTchar, &TcharIn, NULL);
if (Success) pResponse [TcharIn – 2] = '\0';
CloseHandle (hStdIn);
CloseHandle (hStdOut);