Четверг, 02.05.2024, 17:12
Главная Регистрация RSS
Приветствую Вас, Гость
Главная » Delphi и механизмы Windows

Для текстовых документов существуют две совершенно различные кодировки — Windows и MS DOS. Обычно приложения Windows используют, естественно, для текстов кодировку Windows. Но если какие-то файлы должны читаться, например, в Norton Commander или в других приложениях DOS, надо применять кодировку MS DOS. Применение этой кодировки требуется также при разработке консольных приложений Win32.

Для взаимного перевода текста в текст DOS и обратно в API Windows предусмотрены две процедуры: CharToOem — перевод в формат DOS, и OemToChar - перевод из формата DOS в «только текст». Они объявлены в модуле Windows. Для VCL Win32 объявления имеют вид:


function CharToOem(lpszSrc: PAnsiChar; lpszDst: PAnsiChar): BOOL; 
function OemToChar(lpszSrc: PAnsiChar; lpszDst: PAnsiChar): BOOL; 
function CharToOem(lpszSrc: string; lpszDst: StringBuilder): BOOL; 
function OemToChar(lpszSrc: string; lpszDst: StringBuilder): BOOL; 

Обе процедуры принимают два параметра типа PAnsiChar, первый из которых — указатель на строку переводимого текста, а второй — указатель на строку результата перевода.

Приведу сначала пример консольного приложения VCL Win32:


program Projectl; 
{$APPTYPE CONSOLE} 
uses 
Windows; 
var S: array[0..255] of char; 
SI: string; 
begin 
CharToOem('Привет! Введите свое имя:1, S); 
Writeln (S); 
Readln(Sl); 
OemToChar(PChar(SI), PChar (SI)); 
SI := 'Привет, ' + SI; 
CharToOem(PChar(SI), S); 
Writeln(S); 
Readln; 
end. 

Приложение выводит пользователю приглашение: «Привет! Введите свое имя:». Если пользователь в ответ вводит имя, например, «Иванов», то приложение затем печатает текст «Привет, Иванов» и ждет, пока пользователь нажмет клавишу Enter.

Если бы приглашение пользователю выводилось простым оператором:

Writeln('Привет! Введите свое имя:’);
то пользователь увидел бы на экране абракадабру, в которой смог бы узнать только восклицательный знак и двоеточие. Это связано с тем, что консольное приложение работает в окне DOS, в котором символы кириллицы должны задаваться в кодировке MS DOS. Поэтому первый оператор приведенного выше кода переводит функцией CharToOem текст приглашения в эту кодировку. Далее обычной функцией Writeln этот текст выводится на экран. Функция Readln читает введенный пользователем ответ в строку S1. ... Читать всю статью»
Дата: 16.09.2010 | Комментарии (2)

Если требуется более подробная информация о Windows, то, как уже было сказано, удобнее работать с более современной функцией GetVersionEx:

function GetVersionEx(var lpVersionlnformation: TOSVersionInfo): BOOL; stdcall;

Ее единственный параметр указывает запись типа TOSVersionInfo. Поля этой записи содержат следующую информацию:

ПолеОписание
DwOSVersionlnfoSize: DWORDРазмер записи. Должен задаваться до вызова GetVersionEx.
dwMajorVersion: DWORDОсновной номер версии.
dwMinorVersion: DWORDДополнительный номер версии.
dwBuildNumber: DWORDДля Windows NT — номер модификации. Для Windows 9.x младшее слово — номер модификации, старший байт старшего слова — основной номер версии (то же, что dwMajorVersion), младший байт старшего слова — дополнительный номер версии (то же, что dwMinorVersion).
dwPlatformld: DWORDПлатформа операционной системы: VER_PLATFORM_WIN32S — Windows 3.1 с Win32s, VER_PLATFORM_WIN32_WINDOWS — Windows 9x, VER_PLATFORM_WIN32_NT — Windows NT 2000/XP) с Win32.
szCSDVersion: array[0..127] of AnsiChar В VCL.NET: szCSDVersion: stringНеобязательная дополнительная информация.

При использовании функции GetVersionEx пример дешифрации информации о Windows, аналогичный приведенному ранее, может выглядеть так:

function GetWindowsVersionEx: string;
var OSVer: TOSVersionlnfo;
S: string;
begin
OSVer.dwOSVersionlnfoSize := SizeOf(TOSVersionlnfo);
if not GetVersionEx(OSVer)
then begin
Result := GetWindowsVersion;
exit;
end;
GetVersionEx(OSVer);
case OSVer.dwPlatformld of
VER_PLATFORM_WIN32s: S := 'Windows 3.1';
VER_PLATFORM_WIN32_WINDOWS:
if OSVer.dwMajorVersion = 4
then
case OSVer.dwMinorVersion of
0: S := 'Windows 95';
10: if OSVer .'SzCSDVersion [1] = 'A'
then S := 'Windows 98SE'
else S := 'Windows 98';
90: S := 'Windows ME';
else S := 'Неизвестная версия Windows 9x';
end;
VER_PLATFORM_WIN32_NT:
case OSVer.dwMajorVersion of
4: S := 'Windows NT' ;
5: if OSVer.dwMinorVersion = 0
then S := 'Windows 2000'
else if OSVer.dwMinorVersion = 1
then S := 'Windows XP'
else S := 'Неизвестная версия Windows NT';
else S := 'Неизвестная версия Windows NT';
end;
end;
Result := S + ', модификация ' + IntToStr(OSVer.dwBuildNumber);
end;
procedure TForml.Button2Click(Sender: TObject);
begin
Memol.Text := GetWindowsVersion;
end;

Просмотрев этот код, вы увидите, что означают и как надо анализировать поля записи TOSVersionlnfo. Обратите внимание, что в приведенном коде функции GetWindowsVersionEx проверяется значение, возвращаемое библиотечной функцией GetVersionEx, и если вызов GetVersionEx закончился неудачей, то вызывается рассмотренная ранее функция GetWindowsVersion. Дело в том, что, в частности в .NET,с функцией GetVersionEx могут быть проблемы. Так что лучше подстраховаться. ... Читать всю статью»

Дата: 21.07.2010 | Комментарии (1)

Имеются две функции, позволяющие получить информацию о версии Windows: GetVersion и GetVersionEx. Первая из них объявлена в модуле Windows следующим образом:

function GetVersion: DWORD; stdcall;

Эта функция сейчас считается устаревшей, и в новых приложениях рекомендуется применять GetVersionEx.

Но я, все-таки, рассмотрю коротко и функцию GetVersion, так как есть случаи, когда она удобнее. Функция возвращает значение, содержащее в младшем слове номер версии Windows, а в старшем — информацию о платформе операционной системы. Младший байт младшего слова содержит основной номер Windows в шестнадцатеричном виде, а его старший байт (в версиях, кроме Windows 95) содержит дополнительный номер (модификацию) тоже в шестнадцатеричном виде. Таким образом, при распознавании версий можно руководствоваться следующей таблицей:

ПлатформаСтарший битМладший байт (основной номер версии)
Windows NT0
3, или 4, или 5
Windows 951
4
Win32s с Windows 3.11
3

Следующий пример демонстрирует ... Читать всю статью»

Дата: 14.07.2010 | Комментарии (0)