Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Информация о файле [D7, XP]


Страницы:   1 2 3 4

Chort ©   (2006-07-27 23:43:00) 

Здравствуйте! Помогите вытянуть информацию с .exe файлов средствами OpenDialog1. Т.е  необходимо чтобы при нажатии кнопки(пусть будет Button1)  появлялось окно выбора проги (.exe)
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Execute;
end;
И по выборе необходимого файла должна считыватся информация и показываться на экране : Размер, Версия продукта(и файла),Внутреннее имя, Исходное имя файла, Комментарий, Название продукта, Производитель,
Язык, и все что еще возможно извлечь. И как потом можно будет  управлять этими сведениями? Заранее спасибо!


Chort   (2006-08-08 21:25:00) [1]

to Шпиён
Ясно, огромное спасибо!


Шпиён   (2006-08-08 21:08:00) [2]

Упрощенно:
LanguageID - стандартное международное числовое обозначение для языка страны или региона
CodePage - номер набора символов
ps
MSDN:
A language is identified by a LANGID, which is composed of a primary language (for example, Swiss) and a sublanguage (for example, Swiss German).

A language identifier is a standard international numeric abbreviation for the language in a country or geographical region. Each language has a unique language identifier (LANGID), a 16-bit value that consists of a primary language identifier and a sublanguage identifier.


Chort   (2006-08-08 09:16:00) [3]

Весьма благодарен! Объясните что означают Language ID и CodePage(кодовая страница)(какую инфу хранят)


Шпиён   (2006-08-08 02:19:00) [4]

Пример использования:

.................
   DBEDIT14.Text := A.Language;
   DBEDIT15.Text := A.LangID;
   DBEDIT16.Text := A.CodePage;


Шпиён   (2006-08-08 02:13:00) [5]

продолжение:

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;
//Получим LanguageID
function TVerInfoRes.GetLangID : String;
begin
   Result:=  IntToHex(LoWord(TransTable^),4);
end;
//Получим кодовую страницу
function TVerInfoRes.GetCharSet : String;
begin
   Result:=  IntToStr(HiWord(TransTable^));
end;
//Получим  язык
function TVerInfoRes.GetFileLang : String;
begin
SetLength(Result,100);
SetLength(Result, GetLocaleInfo(
   DWORD(LoWord(TransTable^)),
   LOCALE_SLANGUAGE,
   @Result[1],
   100));
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.


Шпиён   (2006-08-08 02:12:00) [6]


{
Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira
}
//Слегка доработан напильником
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;
//Добавим методы:
//Получим  язык
   function GetFileLang      : String;
//Получим LanguageID
   function GetLangID        : String;
//Получим кодовую страницу
   function GetCharSet       : 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;
//Добавим свойства
   property LangID         : String read GetLangID;
   property Language       : String read GetFileLang;
   property CodePage       : String read GetCharSet;
 end;


Шпиён   (2006-08-08 02:10:00) [7]


> Chort ©   (01.08.06 12:25) [70]
> to Шпиён
> Значит написать следующее

Неу ужжж...вот ЭТОГО делать не надо.
Класс я тебе доработал, разбирайся (см. следующий пост)


Chort   (2006-08-01 12:25:00) [8]

to Шпиён
Значит написать следующее
unit Info;

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,
  LangID,
   CharSetID
);

const

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


а куда
LangID := LoWord(TransTable^);
          CharSetID := HiWord(TransTable^);
   ?


Шпиён   (2006-07-30 15:12:00) [9]


> Спасибо Вам! Хотел еще спросить можно ли извлечь и Язык(программы)?

Можно. Но для этого придётся немного доработать класс TVerInfoRes - добавить  метод для извлечения LangID и, при желании, CharSetID из TransTable
           LangID := LoWord(TransTable^);
           CharSetID := HiWord(TransTable^);
По LangID можно определить язык (программы) .


PSPF2003   (2006-07-30 12:51:00) [10]

Хм.. Может сделать за тебя программу ?


Chort   (2006-07-30 12:02:00) [11]

to Шпиён
Пошло, работает. Я думаю, что мне достаточто будет второй и третьей строки  
Label2.Caption:=ExtractFilePath(OpenDialog3.FileName);
Label3.Caption:=OpenDialog3.FileName;

, где указаны путь к папке проги и путь к нужному мне файлу.
Теперь код выглядит преблизительно так
procedure TInfoForm.SpeedButton1Click(Sender: TObject);
var
a : TVerInfoRes;
begin
if not OpenDialog3.Execute then Exit;
a := TVerInfoRes.Create(OpenDialog3.FileName);
try
  DBEDIT1.Text := A.GetPreDefKeyString(viCompanyName);
  DBEDIT2.Text := A.GetPreDefKeyString(viFileDescription);
  DBEDIT3.Text := A.GetPreDefKeyString(viFileVersion);
  DBEDIT4.Text := A.GetPreDefKeyString(viInternalName);
  DBEDIT5.Text := A.GetPreDefKeyString(viLegalCopyright);
  DBEDIT6.Text := A.GetPreDefKeyString(viLegalTrademarks);
  DBEDIT7.Text := A.GetPreDefKeyString(viOriginalFilename);
  DBEDIT8.Text := A.GetPreDefKeyString(viProductName);
  DBEDIT9.Text := A.GetPreDefKeyString(viProductVersion);
   DBEDIT10.Text := A.GetPreDefKeyString(viComments);
   DBEDIT11.Text:=ExtractFilePath(OpenDialog3.FileName);
   DBEDIT12.Text:=OpenDialog3.FileName;
DBEDIT13.Text:=ExtractFileName(OpenDialog3.FileName);
finally
  a.Free;
end;
end;

Оказывается я думал что если назначу поля вывода результата DBEDIT9, DBEDIT10,.....   и подключу необходимые ресурсы и поля, то эта информация будет автоматически заносится в мою таблицу. А вот и нет. При выборе файла информация действительно отображается в DBEdit -ах , но при попытке отредактировать ее (просто при щелчке мыши в поле DBEdit) она просто исчезает и не сохраняется. Но решил проблему так : просто при вызове процедуры
procedure TInfoForm.SpeedButton1Click(Sender: TObject);
я добавляю строку в мою DBGrid1:
procedure TInfoForm.SpeedButton1Click(Sender: TObject);
var
a : TVerInfoRes;
begin
DataModule1.BookTable.Insert;
if not OpenDialog3.Execute then Exit;
a := TVerInfoRes.Create(OpenDialog3.FileName);
try
  DBEDIT1.Text := A.GetPreDefKeyString(viCompanyName);
  DBEDIT2.Text := A.GetPreDefKeyString(viFileDescription);
  DBEDIT3.Text := A.GetPreDefKeyString(viFileVersion);
  DBEDIT4.Text := A.GetPreDefKeyString(viInternalName);
  DBEDIT5.Text := A.GetPreDefKeyString(viLegalCopyright);
  DBEDIT6.Text := A.GetPreDefKeyString(viLegalTrademarks);
  DBEDIT7.Text := A.GetPreDefKeyString(viOriginalFilename);
  DBEDIT8.Text := A.GetPreDefKeyString(viProductName);
  DBEDIT9.Text := A.GetPreDefKeyString(viProductVersion);
   DBEDIT10.Text := A.GetPreDefKeyString(viComments);
   DBEDIT11.Text:=ExtractFilePath(OpenDialog3.FileName);
   DBEDIT12.Text:=OpenDialog3.FileName;
finally
  a.Free;
end;
end;

Спасибо Вам! Хотел еще спросить можно ли извлечь и Язык(программы)?


Шпиён   (2006-07-30 00:23:00) [12]

А теперь сравни свой код с примером -)
В примере:

if OpenDialog1.Execute then
 begin
.................
  end;

а у тебя?

Перепиши примерно так:

procedure TInfoForm.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog3.Execute then
begin
    Label1.Caption:=GetCurrentDir;
    Label2.Caption:=ExtractFilePath(OpenDialog3.FileName);
    Label3.Caption:=OpenDialog3.FileName;
    Label4.Caption:=ExtractFileDir(OpenDialog3.FileName);
    Label5.Caption:=ExtractFileName(OpenDialog3.FileName);
end;
end;

И не забудь в диалоге файл выбрать -)


Chort   (2006-07-30 00:01:00) [13]


> Что-то тут не чисто -))))

Гдето я это слышал
Ну я не знаю почемя не отображает(что собственно должно показыватся).
На форме есть кнопка, по нажатию которой написано
procedure TInfoForm.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog3.Execute then

     Label1.Caption:=GetCurrentDir;
     Label2.Caption:=ExtractFilePath(OpenDialog3.FileName);
     Label3.Caption:=OpenDialog3.FileName;
     Label4.Caption:=ExtractFileDir(OpenDialog3.FileName);
     Label5.Caption:=ExtractFileName(OpenDialog3.FileName);
 end;

Перед этим по нажатию этой же кнопки для DBEdit -ов я писал
procedure TInfoForm.SpeedButton1Click(Sender: TObject);
var
a : TVerInfoRes;
begin
if not OpenDialog3.Execute then Exit;
a := TVerInfoRes.Create(OpenDialog3.FileName);
try
  DBEDIT1.Text := A.GetPreDefKeyString(viCompanyName);
  DBEDIT2.Text := A.GetPreDefKeyString(viFileDescription);
  DBEDIT3.Text := A.GetPreDefKeyString(viFileVersion);
  DBEDIT4.Text := A.GetPreDefKeyString(viInternalName);
  DBEDIT5.Text := A.GetPreDefKeyString(viLegalCopyright);
  DBEDIT6.Text := A.GetPreDefKeyString(viLegalTrademarks);
  DBEDIT7.Text := A.GetPreDefKeyString(viOriginalFilename);
  DBEDIT8.Text := A.GetPreDefKeyString(viProductName);
  DBEDIT9.Text := A.GetPreDefKeyString(viProductVersion);
  DBEDIT10.Text := A.GetPreDefKeyString(viComments);
finally
  a.Free;

end;
end;

Ну и отображалась информация соответственно правильно


Шпиён   (2006-07-29 23:51:00) [14]


> Никаких изменений вообще(как была надпись Label1,...  так
> и осталось).

Что-то тут не чисто -))))


Chort   (2006-07-29 23:45:00) [15]

to Шпиён
Сделал по второму примеру
procedure TInfoForm.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog3.Execute then

      Label1.Caption:=GetCurrentDir;
      Label2.Caption:=ExtractFilePath(OpenDialog3.FileName);
      Label3.Caption:=OpenDialog3.FileName;
      Label4.Caption:=ExtractFileDir(OpenDialog3.FileName);
      Label5.Caption:=ExtractFileName(OpenDialog3.FileName);
  end;

Никаких изменений вообще(как была надпись Label1,...  так и осталось).
Я вот посмотрел по свойствам файлов, ведь существует еще такой пункт как Язык.


KilkennyCat   (2006-07-29 23:33:00) [16]

> [56] PSPF2003 ©   (29.07.06 16:10)

нет, я про выше. [45]


Шпиён   (2006-07-29 23:09:00) [17]

Или чуть побольше -)

if OpenDialog1.Execute then
   begin
       Label1.Caption:=GetCurrentDir;
       Label2.Caption:=ExtractFilePath(OpenDialog1.FileName);
       Label3.Caption:=OpenDialog1.FileName;
       Label4.Caption:=ExtractFileDir(OpenDialog1.FileName);
       Label5.Caption:=ExtractFileName(OpenDialog1.FileName);
   end;


Шпиён   (2006-07-29 23:06:00) [18]


> Главная проблема- как считать этот путь  файла и отобразить!

Сделай мааааленький эксперимент -)

if OpenDialog1.Execute then
   begin
       Label1.Caption:=GetCurrentDir;
       Label2.Caption:=ExtractFilePath(OpenDialog1.FileName);
       Label3.Caption:=OpenDialog1.FileName;
   end;


Chort   (2006-07-29 20:54:00) [19]

to Шпиён
Спасибо за код!
Мне не нужно в реестре. Сначала нужно этот путь(адрес) влепить в DBEdit а потом оно само уже сохранится в базе данных Access(ну и будет отображаться в DBGrid1).Главная проблема- как считать этот путь  файла и отобразить!


Шпиён   (2006-07-29 20:45:00) [20]


> Chort ©   (29.07.06 20:30) [57]


>  когда я указываю OpenDialog1 ом файл, с которого хочу считать
> инфу, то можноли еще и както записать  путь этого файла
> в мою программу?

Без "хакерских методов" нельзя -) Сохраняй в реестре или ini-файле.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо