Содержание материала

Заметим, что кроме 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). Впрочем, для модификации значений выводимых символов не обязательно использовать системные функции, что открывает простор для консольного вывода в самых разных кодировках.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить