- •Файловая система и файловый ввод-вывод
- •Краткие теоретические сведения
- •Разбиение на разделы
- •Определение имеющихся логических дисков
- •1.3 Получение информации о томах
- •Поиск файлов
- •1.5.1 Отложенный (асинхронный) ввод-вывод
- •1.5.2 Контроль ошибок ввода-вывода
- •Методика выполнения
- •Отчет о работе
- •Контрольные вопросы
- •Получение информации об exe-файлах ms Windows
Контрольные вопросы
Дать определения сектора, кластера, дорожки, цилиндра, простого и составного тома.
Алгоритм и функции получения информации о логических дисках.
Получение информации о параметрах логического раздела.
Алгоритм и функции поиска файлов.
Какая информация хранится в EXE-файле?
Атрибуты файла.
Функции ввода-вывода Win32 API.
Синхронный и асинхронный способы ввод-вывода информации. Факторы, влияющие на эффективность асинхронного способа ввода-вывода.
Приложение
Получение информации об exe-файлах ms Windows
Наиболее полная информация об EXE-файле операционной системы MS Windows может быть получена с помощью свободно распространяемого компонента, текст которого приведен ниже.
unit gsFileVersionInfo;
//**! ------------------------------------------------------------------
//**! This unit is a part of GSPackage project (Gregory Sitnin's Delphi
//**! Components Package).
//**! ------------------------------------------------------------------
//**! You may use or redistribute this unit for your purposes while
//**! unit's code and this copyright notice is unchanged and exists.
//**! ------------------------------------------------------------------
//**! (c) Gregory Sitnin, 2001-2002. All rights reserved.
//**! ------------------------------------------------------------------
interface
uses
Classes, SysUtils;
type
TgsFileVersionInfo = class(TComponent)
private
FFilename: TFilename;
FVersionInfoSize: cardinal;
FFileVersion: string;
FFileDescription: string;
FInternalName: string;
FOriginalFilename: string;
FCompanyName: string;
FProductVersion: string;
FProductName: string;
FLegalCopyright: string;
FLanguageInfo: string;
FComments: string;
procedure SetFilename(const Value: TFilename);
{ Private declarations }
protected
{ Protected declarations }
property VersionInfoSize: cardinal read FVersionInfoSize;
procedure LoadFromFile;
procedure ClearAll;
public
{ Public declarations }
published
{ Published declarations }
function GetBuildOnly: string;
property Filename: TFilename read FFilename write SetFilename;
property LanguageInfo: string read FLanguageInfo;
property CompanyName: string read FCompanyName;
property FileDescription: string read FFileDescription;
property FileVersion: string read FFileVersion;
property InternalName: string read FInternalName;
property LegalCopyright: string read FLegalCopyright;
property OriginalFilename: string read FOriginalFilename;
property ProductName: string read FProductName;
property ProductVersion: string read FProductVersion;
property Comments: string read FComments;
end;
procedure Register;
implementation
uses Windows;
procedure Register;
begin
RegisterComponents('WentTermkal2003', [TgsFileVersionInfo]);
end;
{ TgsFileVersionInfo }
procedure TgsFileVersionInfo.ClearAll;
begin
FVersionInfoSize:= 0;
FCompanyName := '';
FFileDescription := '';
FFileVersion := '';
FInternalName := '';
FLegalCopyright := '';
FOriginalFilename := '';
FProductName := '';
FProductVersion := '';
FComments := '';
end;
function TgsFileVersionInfo.GetBuildOnly: string;
var p: integer;
s: string;
begin
s := FileVersion;
p := LastDelimiter('.',s);
Result := copy(s,p+1,length(s)-p);
end;
procedure TgsFileVersionInfo.LoadFromFile;
var VISize: cardinal;
VIBuff: pointer;
trans: pointer;
buffsize: cardinal;
temp: integer;
str: pchar;
LangCharSet: string;
function GetStringValue(const From: string): string;
begin
VerQueryValue(VIBuff,pchar('\StringFileInfo\'+LanguageInfo+'\'+From), pointer(str),
buffsize);
if buffsize > 0 then Result := str else Result := 'n/a';
end;
begin
ClearAll;
VIBuff := nil;
if not fileexists(Filename) then raise EFilerError.Create('File not found: '+Filename);
VISize := GetFileVersionInfoSize(pchar(Filename),buffsize);
FVersionInfoSize := VISize;
if VISize < 1 then raise EReadError.Create('Invalid version info record in file '+Filename);
VIBuff := AllocMem(VISize);
GetFileVersionInfo(pchar(Filename),cardinal(0),VISize,VIBuff);
VerQueryValue(VIBuff,'\VarFileInfo\Translation',Trans,buffsize);
if buffsize >= 4 then
begin
temp:=0;
StrLCopy(@temp, pchar(Trans), 2);
LangCharSet:=IntToHex(temp, 4);
StrLCopy(@temp, pchar(Trans)+2, 2);
FLanguageInfo := LangCharSet+IntToHex(temp, 4);
end else raise EReadError.Create('Invalid language info in file '+Filename);
FCompanyName := GetStringValue('CompanyName');
FFileDescription := GetStringValue('FileDescription');
FFileVersion := GetStringValue('FileVersion');
FInternalName := GetStringValue('InternalName');
FLegalCopyright := GetStringValue('LegalCopyright');
FOriginalFilename := GetStringValue('OriginalFilename');
FProductName := GetStringValue('ProductName');
FProductVersion := GetStringValue('ProductVersion');
FComments := GetStringValue('Comments');
FreeMem(VIBuff,VISize);
end;
procedure TgsFileVersionInfo.SetFilename(const Value: TFilename);
begin
FFilename := Value;
LoadFromFile;
end;
end.