Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Данные о процессе, типа версия, путь к файлу... 
:(
    Опции темы
Dreyka
  Дата 6.8.2004, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.7.2004

Репутация: нет
Всего: нет



Помогите, пожалуйста...
Я хочу научиться доставать информацию о файле, а именно версию, авторские права, название окна, если таковое имеется, командную строку запуска... и т.д. и т.п.
PM MAIL WWW ICQ   Вверх
Pakshin A. S.
Дата 6.8.2004, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Есть конкретно по файлам:

Есть такая штука (в Help'e всё есть):
TSearchRec & TSearchRec.FindData

Вот ещё одна вещичка:

Код

unit VerInfo;

interface

uses SysUtils, WinTypes, Dialogs, Classes;

type
 { define a generic exception class for version info, and an exception
   to indicate that no version info is available. }
 EVerInfoError   = class(Exception);
 ENoVerInfoError = class(Exception);
 eNoFixeVerInfo  = class(Exception);

 // define enum type representing different types of version info
 TVerInfoType =
   (viCompanyName,
    viFileDescription,
    viFileVersion,
    viInternalName,
    viLegalCopyright,
    viLegalTrademarks,
    viOriginalFilename,
    viProductName,
    viProductVersion,
    viComments);

const

 // define an array constant of strings representing the pre-defined
 // version information keys.
 VerNameArray: array[viCompanyName..viComments] of String[20] =
 ('CompanyName',
  'FileDescription',
  'FileVersion',
  'InternalName',
  'LegalCopyright',
  'LegalTrademarks',
  'OriginalFilename',
  'ProductName',
  'ProductVersion',
  'Comments');

type

 // Define the version info class
 TVerInfoRes = class
 private
   Handle            : DWord;
   Size              : Integer;
   RezBuffer         : String;
   TransTable        : PLongint;
   FixedFileInfoBuf  : PVSFixedFileInfo;
   FFileFlags        : TStringList;
   FFileName         : String;
   procedure FillFixedFileInfoBuf;
   procedure FillFileVersionInfo;
   procedure FillFileMaskInfo;
 protected
   function GetFileVersion   : String;
   function GetProductVersion: String;
   function GetFileOS        : String;
 public
   constructor Create(AFileName: String);
   destructor Destroy; override;
   function GetPreDefKeyString(AVerKind: TVerInfoType): String;
   function GetUserDefKeyString(AKey: String): String;
   property FileVersion    : String read GetFileVersion;
   property ProductVersion : String read GetProductVersion;
   property FileFlags      : TStringList read FFileFlags;
   property FileOS         : String read GetFileOS;
 end;

implementation

uses Windows;

const
 // strings that must be fed to VerQueryValue() function
 SFInfo                = '\StringFileInfo\';
 VerTranslation: PChar = '\VarFileInfo\Translation';
 FormatStr             = '%s%.4x%.4x\%s%s';


constructor TVerInfoRes.Create(AFileName: String);
begin
 FFileName := aFileName;
 FFileFlags := TStringList.Create;
 // Get the file version information
 FillFileVersionInfo;
 //Get the fixed file info
 FillFixedFileInfoBuf;
 // Get the file mask values
 FillFileMaskInfo;
end;


destructor TVerInfoRes.Destroy;
begin
 FFileFlags.Free;
end;

procedure TVerInfoRes.FillFileVersionInfo;
var
 SBSize: UInt;
begin
 // Determine size of version information
 Size := GetFileVersionInfoSize(PChar(FFileName), Handle);
 if Size <= 0 then         { raise exception if size <= 0 }
   raise ENoVerInfoError.Create('No Version Info Available.');

 // Set the length accordingly
 SetLength(RezBuffer, Size);
 // Fill the buffer with version information, raise exception on error
 if not GetFileVersionInfo(PChar(FFileName), Handle, Size, PChar(RezBuffer)) then
   raise EVerInfoError.Create('Cannot obtain version info.');

 // Get translation info, raise exception on error
 if not VerQueryValue(PChar(RezBuffer), VerTranslation,  pointer(TransTable),
 SBSize) then
   raise EVerInfoError.Create('No language info.');
end;

procedure TVerInfoRes.FillFixedFileInfoBuf;
var
 Size: Cardinal;
begin
 if VerQueryValue(PChar(RezBuffer), '\', Pointer(FixedFileInfoBuf), Size) then begin
    if Size < SizeOf(TVSFixedFileInfo) then
       raise eNoFixeVerInfo.Create('No fixed file info');
 end
 else
   raise eNoFixeVerInfo.Create('No fixed file info')
end;

procedure TVerInfoRes.FillFileMaskInfo;
begin
 with FixedFileInfoBuf^ do begin
   if (dwFileFlagsMask and dwFileFlags and VS_FF_PRERELEASE) <> 0then
     FFileFlags.Add('Pre-release');
   if (dwFileFlagsMask and dwFileFlags and VS_FF_PRIVATEBUILD) <> 0 then
     FFileFlags.Add('Private build');
   if (dwFileFlagsMask and dwFileFlags and VS_FF_SPECIALBUILD) <> 0 then
     FFileFlags.Add('Special build');
   if (dwFileFlagsMask and dwFileFlags and VS_FF_DEBUG) <> 0 then
     FFileFlags.Add('Debug');
 end;
end;

function TVerInfoRes.GetPreDefKeyString(AVerKind: TVerInfoType): String;
var
 P: PChar;
 S: UInt;
begin
 Result := Format(FormatStr, [SfInfo, LoWord(TransTable^),HiWord(TransTable^),
   VerNameArray[aVerKind], #0]);
 // get and return version query info, return empty string on error
 if VerQueryValue(PChar(RezBuffer), @Result[1], Pointer(P), S) then
   Result := StrPas(P)
 else
   Result := '';
end;

function TVerInfoRes.GetUserDefKeyString(AKey: String): String;
var
 P: Pchar;
 S: UInt;
begin
 Result := Format(FormatStr, [SfInfo, LoWord(TransTable^),HiWord(TransTable^),
   aKey, #0]);
 // get and return version query info, return empty string on error
 if VerQueryValue(PChar(RezBuffer), @Result[1], Pointer(P), S) then
   Result := StrPas(P)
 else
   Result := '';
end;


function VersionString(Ms, Ls: Longint): String;
begin
 Result := Format('%d.%d.%d.%d', [HIWORD(Ms), LOWORD(Ms),
    HIWORD(Ls), LOWORD(Ls)]);
end;

function TVerInfoRes.GetFileVersion: String;
begin
 with FixedFileInfoBuf^ do
   Result := VersionString(dwFileVersionMS, dwFileVersionLS);
end;

function TVerInfoRes.GetProductVersion: String;
begin
 with FixedFileInfoBuf^ do
   Result := VersionString(dwProductVersionMS, dwProductVersionLS);
end;

function TVerInfoRes.GetFileOS: String;
begin
 with FixedFileInfoBuf^ do
   case dwFileOS of
     VOS_UNKNOWN:  // Same as VOS__BASE
       Result := 'Unknown';
     VOS_DOS:
       Result := 'Designed for MS-DOS';
     VOS_OS216:
       Result := 'Designed for 16-bit OS/2';
     VOS_OS232:
       Result := 'Designed for 32-bit OS/2';
     VOS_NT:
       Result := 'Designed for Windows NT';


     VOS__WINDOWS16:
       Result := 'Designed for 16-bit Windows';
     VOS__PM16:
       Result := 'Designed for 16-bit PM';
     VOS__PM32:
       Result := 'Designed for 32-bit PM';
     VOS__WINDOWS32:
       Result := 'Designed for 32-bit Windows';

     VOS_DOS_WINDOWS16:
       Result := 'Designed for 16-bit Windows, running on MS-DOS';
     VOS_DOS_WINDOWS32:
       Result := 'Designed for Win32 API, running on MS-DOS';
     VOS_OS216_PM16:
       Result := 'Designed for 16-bit PM, running on 16-bit OS/2';
     VOS_OS232_PM32:
       Result := 'Designed for 32-bit PM, running on 32-bit OS/2';
     VOS_NT_WINDOWS32:
       Result := 'Designed for Win32 API, running on Windows/NT';
   else
     Result := 'Unknown';
   end;
end;


end.


Код

unit MainFrm;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls,
 Forms, Dialogs, FileCtrl, StdCtrls, verinfo, Grids, Outline, DirOutln,
 ComCtrls;

type
 TMainForm = class(TForm)
   lvVersionInfo: TListView;
   btnClose: TButton;
   procedure FormDestroy(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure btnCloseClick(Sender: TObject);
 private
   VerInfoRes: TVerInfoRes;
 end;

var
 MainForm: TMainForm;

implementation

{$R *.DFM}

procedure AddListViewItem(const aCaption, aValue: String; aData: Pointer;
 aLV: TListView);
// This method is used to add a TListItem to the TListView, aLV
var
 NewItem: TListItem;
begin
 NewItem := aLV.Items.Add;
 NewItem.Caption := aCaption;
 NewItem.Data := aData;
 NewItem.SubItems.Add(aValue);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 VerInfoRes := TVerInfoRes.Create(Application.ExeName);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
 VerInfoRes.Free;
end;

procedure TMainForm.FormShow(Sender: TObject);
var
 VerString: String;
 i: integer;
 sFFlags: String;

begin
 for i := ord(viCompanyName) to ord(viComments) do begin
   VerString := VerInfoRes.GetPreDefKeyString(TVerInfoType(i));
   if VerString <> '' then
     AddListViewItem(VerNameArray[TVerInfoType(i)], VerString, nil,
       lvVersionInfo);
 end;
 VerString := VerInfoRes.GetUserDefKeyString('Author');
 if VerString <> EmptyStr then
     AddListViewItem('Author', VerString, nil, lvVersionInfo);
     

 AddListViewItem('File Version', VerInfoRes.FileVersion, nil,
   lvVersionInfo);
 AddListViewItem('Product Version', VerInfoRes.ProductVersion, nil,
   lvVersionInfo);
 for i := 0 to VerInfoRes.FileFlags.Count - 1 do begin
   if i <> 0 then
     sFFlags := SFFlags+', ';
   sFFlags := SFFlags+VerInfoRes.FileFlags[i];
 end;
 AddListViewItem('File Flags',SFFlags, nil, lvVersionInfo);
 AddListViewItem('Operating System', VerINfoRes.FileOS, nil, lvVersionInfo);

end;

procedure TMainForm.btnCloseClick(Sender: TObject);
begin
 Close;
end;

end.

PM   Вверх
Dreyka
Дата 7.8.2004, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.7.2004

Репутация: нет
Всего: нет



Pakshin A. S.

Понемногу разбираюсь с кодом, но у меня появляются две ошибки

1:
Цитата
lvVersionInfo: TListView;

Возникает ошибка :
Цитата
"Field Form1.IvVersionInfo does not have a corresponding component. Remove the declaration?"


2:
Цитата
NewItem := aLV.Items.Add;

Возникает ошибка:
Цитата
Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 0045c265 in module 'Project2.exe'. Read of address 0000022c'. Process stopped. Use Step or Run to continue.


Помоги исправить, пожалуйста... sad.gif
PM MAIL WWW ICQ   Вверх
Pakshin A. S.
Дата 7.8.2004, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



В общем: этот код исключительно представлен для ознакомления (verinfo.pas) и для примера применения (mainfrm.pas).
Конкретно: на форме у тебя должны присутствовать две вещи:
1) Компонент ListView:
ListView1.Name = lvVersionInfo;
Созданы два поля: Key и Value
2) Компонент Button:
Button1.Name = btnClose;
PM   Вверх
Dreyka
Дата 9.8.2004, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.7.2004

Репутация: нет
Всего: нет



Ну а как насчёт узнать откуда запущен процесс?
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 9.8.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Код
uses ..., TlHelp32;
+ F1


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Dreyka
Дата 10.8.2004, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 13.7.2004

Репутация: нет
Всего: нет



А если файл не содержит информации о себе qstn.gif
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.