Советы пользователям Delphi и C++Builder


         

Получение сведений об операционной системе


Нередко при разработке приложений требуется определить, какова версия операционной системы, где расположены системные каталоги, каковы значения переменных окружения. Для этой цели используются функции Windows API, такие как GetVersionEx (определение типа операционной системы), GetComputerName(определение сетевого имени компьютера), GetUserName (определение имени пользователя), GetSystemDirectory (определение местоположения системного каталога), GetWindowsDirectory (определение каталога Windows), ExpandEnvironmentStrings (определение значений переменных окружения), а также структуры Windows (например, OSVERSIONINFO). Подробные сведения об этих функциях и структурах содержатся в справке по Windows API, входящей в комплект поставки как C++Builder, так и Delphi.

Приведем простейший пример использования некоторых из этих функций, являющийся в значительной степени вариацией на тему стандартных примеров использования Windows API. Поместим на главную форму вновь созданного приложения несколько меток и кнопку и создадим обработчик события, связанный с нажатием на кнопку и отображающий системную информацию в метках:

void __fastcall TForm1::Button1Click(TObject *Sender) { LPTSTR lpszSystemInfo; DWORD cchBuff = 256; TCHAR tchBuffer2[1000]; DWORD dwResult; TCHAR tchBuffer[1000]; int nSize;

lpszSystemInfo = tchBuffer2;

GetComputerName(lpszSystemInfo, &cchBuff); nSize = sprintf(tchBuffer, "Компьютер: %s", lpszSystemInfo); Label1->Caption=AnsiString(tchBuffer);

GetUserName(lpszSystemInfo, &cchBuff); nSize = sprintf(tchBuffer, "Пользователь: %s", lpszSystemInfo); Label2->Caption=AnsiString(tchBuffer);

nSize = GetSystemDirectory(lpszSystemInfo, MAX_PATH); nSize = sprintf(tchBuffer, "System directory: %s", lpszSystemInfo); Label3->Caption=AnsiString(tchBuffer);

nSize = GetWindowsDirectory(lpszSystemInfo, MAX_PATH); nSize = sprintf(tchBuffer, "Windows directory: %s", lpszSystemInfo); Label4->Caption=AnsiString(tchBuffer); Label5->Caption="Переменные окружения :";


dwResult = ExpandEnvironmentStrings("OS=%OS% ", lpszSystemInfo, 500); Label6->Caption=AnsiString(lpszSystemInfo);
dwResult = ExpandEnvironmentStrings("INCLUDE=%INCLUDE%",lpszSystemInfo,500); Label7->Caption=AnsiString(lpszSystemInfo);
dwResult = ExpandEnvironmentStrings("CLASSPATH=%CLASSPATH%",lpszSystemInfo,500); Label8->Caption=AnsiString(lpszSystemInfo);
dwResult = ExpandEnvironmentStrings("ComSpec=%ComSpec%",lpszSystemInfo,500); Label9->Caption=AnsiString(lpszSystemInfo);
OSVERSIONINFO osvi; char szVersion [80];


memset(&osvi, 0, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); GetVersionEx (&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32s) wsprintf (szVersion, "Microsoft Win32s %d.%d (Build %d)", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) wsprintf (szVersion, "Microsoft Windows 95 %d.%d (Build %d)",
osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF);
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) wsprintf (szVersion, "Microsoft Windows NT %d.%d (Build %d)",
osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber & 0xFFFF); Label10->Caption="Операционная система: "+AnsiString(szVersion);
}
Соответствующий код для Delphi выглядит так:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); var osvi: TOSVersionInfo; si: TSystemInfo; s:string; dwResult, nsize: Cardinal; ch : array[0..1000] of Char; begin


GetComputerName(ch, nsize); Label1.Caption:='Компьютер: '+ch;
GetUserName(ch, nsize); Label2.Caption:='Пользователь: '+ch;
nSize := GetSystemDirectory(ch, MAX_PATH); Label3.Caption:='System directory: '+ch;
nSize := GetWindowsDirectory(ch, MAX_PATH); Label4.Caption:='Windows directory: '+ch;
Label5.Caption:='Переменные окружения :';
dwResult:= ExpandEnvironmentStrings('OS=%OS% ', ch, 500); Label6.Caption:=ch;
dwResult:= ExpandEnvironmentStrings('INCLUDE=%INCLUDE%',ch,500); Label7.Caption:=ch;
dwResult:= ExpandEnvironmentStrings('CLASSPATH=%CLASSPATH%',ch,500); Label8.Caption:=ch;
dwResult := ExpandEnvironmentStrings('ComSpec=%ComSpec%',ch,500); Label9.Caption:=ch;
osvi.dwOSVersionInfoSize := sizeof (OSVERSIONINFO); GetVersionEx (osvi);
if (osvi.dwPlatformId = VER_PLATFORM_WIN32s) then s:= 'Microsoft Win32s '+IntToStr(osvi.dwMajorVersion)+'.'+ IntToStr(osvi.dwMinorVersion) +' Build '+ IntToStr(osvi.dwBuildNumber);
if (osvi.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) then s:= 'Microsoft Windows 95 '+IntToStr(osvi.dwMajorVersion)+'.'+ IntToStr(osvi.dwMinorVersion) +' Build '+ IntToStr(osvi.dwBuildNumber);
if (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT) then s:= 'Microsoft Windows NT '+IntToStr(osvi.dwMajorVersion)+'.'+ IntToStr(osvi.dwMinorVersion) +' Build '+ IntToStr(osvi.dwBuildNumber);
Label10.Caption:=' Операционная система: '+s;
end;
end.
Если запустить это приложение, оно отобразит сведения о системе и переменных окружения:

Рис. 4. Приложение для вывода сведений о системе
Отметим, что в настоящее время имеется немалое количество свободно распространяемых, условно-бесплатных и коммерческих компонентов для Delphi и C++Builder, предназначенных для получения системной информации (некоторые из них содержатся на компакт-диске в данном номере журнала). Все они так или иначе используют те же самые функции Windows API для установки или считывания значений своих свойств или выполнения методов, и основное их преимущество заключается главным образом в том, что они избавляют программиста от необходимости создания кода, подобного приведенному выше. Соответственно при разработке приложений можно использовать как непосредственно функции Windows API, как в приведенных выше примерах, так и готовые компоненты.

Содержание раздела