Заметим, что кроме InOutFunc вывод в файл ОС происходит и в FlushFunc, которая в файле Output указывает на ту же функцию, что и InOutFunc. С учетом всего вышесказанного модуль, осуществляющий «русификацию» консольных приложений «на лету» будет совсем небольшим:
Code: |
{ Модуль “русификации“ консольных приложений (c) Eugene Kasnerik, e-mail: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. } unit EsConsole;
interface
implementation
uses Windows;
{ Описание структуры приведено здесь с единственной целью – не подключать SysUtils и, соответственно, код инициализации этого модуля. Консольные приложения обычно малы и 25К кода обработки исключений – несколько высокая плата за описание единственной структуры. } type TTextRec = record Handle: Integer; Mode: Integer; BufSize: Cardinal; BufPos: Cardinal; BufEnd: Cardinal; BufPtr: PChar; OpenFunc: Pointer; InOutFunc: Pointer; FlushFunc: Pointer; CloseFunc: Pointer; UserData: array[1..32] of Byte; name: array[0..259] of Char; Buffer: array[0..127] of Char; end;
function ConOutFunc(var Text: TTextRec): Integer; var Dummy: Cardinal; SavePos: Integer; begin SavePos := Text.BufPos; if SavePos > 0 then begin Text.BufPos := 0; CharToOemBuff(Text.BufPtr, Text.BufPtr, SavePos); if WriteFile(Text.Handle, Text.BufPtr^, SavePos, Dummy, nil) then Result := 0 else Result := GetLastError; end else Result := 0; end;
initialization Rewrite(Output); // Проводим инициализацию файла { И подменяем обработчики. Есть в этом что-то от хака, но цель оправдывает средства } TTextRec(Output).InOutFunc := @ConOutFunc; TTextRec(Output).FlushFunc := @ConOutFunc; end. |
Для русификации приложения достаточно лишь подключить вышеуказанный модуль в любом месте программы (как правило, в проекте), после чего вывод ANSI-символов будет осуществлен в ожидаемом виде. Однако следует иметь в виду, что не будут доступны символы псевдографики (для них нет аналогов в ANSI, т.е. в редакторе их не введешь) и часть диакритических знаков (для них нет аналогов в OEM). Впрочем, для модификации значений выводимых символов не обязательно использовать системные функции, что открывает простор для консольного вывода в самых разных кодировках.
- << Назад
- Вперёд
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!