Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО от Тихомирова / Файловая_система 9 лр.doc
Скачиваний:
19
Добавлен:
08.06.2015
Размер:
126.98 Кб
Скачать
  1. Контрольные вопросы

    1. Дать определения сектора, кластера, дорожки, цилиндра, простого и составного тома.

    2. Алгоритм и функции получения информации о логических дисках.

    3. Получение информации о параметрах логического раздела.

    4. Алгоритм и функции поиска файлов.

    5. Какая информация хранится в EXE-файле?

    6. Атрибуты файла.

    7. Функции ввода-вывода Win32 API.

    8. Синхронный и асинхронный способы ввод-вывода информации. Факторы, влияющие на эффективность асинхронного способа ввода-вывода.

Приложение

Получение информации об 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.