Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

Информация о файле   Найти похожие ветки 

 
Chort ©   (2006-07-27 23:43) [0]

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


 
KilkennyCat ©   (2006-07-28 00:18) [1]

Эта информация "управляется" изготовителем (читай: владельцем авторских прав), и обладателем имущественных прав (читай: владельцем программного обеспечения).


 
KilkennyCat ©   (2006-07-28 00:20) [2]

И еще: OpenDialog1 позволяет получить только имя. Больше никаких средств у него нет. Имя и все. Файла, директории, диска.


 
Германн ©   (2006-07-28 00:31) [3]

2 KilkennyCat ©   (28.07.06 00:20) [2]

> И еще: OpenDialog1 позволяет получить только имя. Больше
> никаких средств у него нет. Имя и все. Файла, директории,
диска.

Давай не будем сбивать с толку "Начинающих" и напишем:
OpenDialog1 позволяет получить только имя, которое включает в себя:
 -Метку диска
 -Путь к файлу
 -Собственно имя файла.
:-)
2 Chort ©   (27.07.06 23:43)

> И по выборе необходимого файла

переводится как if OpenDialog1.Execute then begin.
А теперь задай вопрос как зная имя файла получить
Размер, Версия продукта(и файла),Внутреннее имя, Исходное имя файла, Комментарий, Название продукта, Производитель,
Язык, и все что еще возможно извлечь.


Ну а вот про И как потом можно будет  управлять этими сведениями?
я вообще пас :(((


 
Шпиён   (2006-07-28 00:37) [4]


> Германн ©   (28.07.06 00:31) [3]


> Ну а вот про И как потом можно будет  управлять этими сведениями?
>
> я вообще пас :(((

"Управлять" можно... если учесть, что информация хранится в ресурсах. Подробнее рассказывать не стоит, т.к. незачем приличному пользователю ее менять -)


 
Германн ©   (2006-07-28 00:54) [5]


> Шпиён   (28.07.06 00:37) [4]

Моё "я вообще пас" означало, что я ну в упор не понимаю как, для чего, зачем и т.п. "управлять этими сведениями".
Разве что с "фискальными" целями. :-)


 
Шпиён   (2006-07-28 00:56) [6]


> Германн ©   (28.07.06 00:54) [5]


> Разве что с "фискальными" целями. :-)

это как?


 
KilkennyCat ©   (2006-07-28 01:06) [7]

> [6] Шпиён   (28.07.06 00:56)

Это продавать с чеком. А на чеке написано: фискальный.


 
Германн ©   (2006-07-28 01:24) [8]


> Шпиён   (28.07.06 00:56) [6]
> > Германн ©   (28.07.06 00:54) [5] > Разве что с "фискальными"
> целями. :-)это как?

Как - вариантов масса! А смайлик ты не заметил?


 
Шпиён   (2006-07-28 01:29) [9]


> Германн ©   (28.07.06 01:24) [8]

заметил -) Но вот никак не могу привязать подмену авторской информации о файле к фискальным целям -)))))
Потому и прошу вариант, вдруг пригодится -)


 
Шпиён   (2006-07-28 01:48) [10]

{
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;
 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.


 
Германн ©   (2006-07-28 01:51) [11]


> Потому и прошу вариант, вдруг пригодится -)

Неа! "Вечером деньги, утром стулья, но деньги вперёд!"
Если уж речь пошла о "фискальном" аспекте, то предоплата "однозначно"! :-)


 
Шпиён   (2006-07-28 01:52) [12]


> Германн ©   (28.07.06 01:51) [11]

ууу....жадина :Р
-))


 
Германн ©   (2006-07-28 01:55) [13]


> ууу....жадина :Р-))

Кажется мне, что я не далее чем пару часов назад уже где-то видел что-то подобное, но не ко мне, а к кому-то другому!


 
KilkennyCat ©   (2006-07-28 01:56) [14]

> GetFileOS


как-то неочень полно...


 
Шпиён   (2006-07-28 01:57) [15]


> KilkennyCat ©   (28.07.06 01:56) [14]

"as is" - все вопросы - к авторам -)


 
KilkennyCat ©   (2006-07-28 02:00) [16]

> [15] Шпиён   (28.07.06 01:57)

Беспокоить столь уважаемых таким пустяком ?! Ладно бы, водки выпить, шашлык скушать предложить...


 
Шпиён   (2006-07-28 02:05) [17]


> KilkennyCat ©   (28.07.06 02:00) [16]

Уговорил -)
MSDN 2006:
dwFileOS
Specifies the operating system for which this file was designed. This member can be one of the following values.
VOS_DOS
The file was designed for Microsoft MS-DOS.
VOS_NT
The file was designed for Microsoft Windows NT.
VOS__WINDOWS16
The file was designed for 16-bit Windows.
VOS__WINDOWS32
The file was designed for 32-bit Windows.
VOS_OS216
The file was designed for 16-bit OS/2.
VOS_OS232
The file was designed for 32-bit OS/2.
VOS__PM16
The file was designed for 16-bit Presentation Manager.
VOS__PM32
The file was designed for 32-bit Presentation Manager.
VOS_UNKNOWN
The operating system for which the file was designed is unknown to the system.
An application can combine these values to indicate that the file was designed for one operating system running on another. The following dwFileOS values are examples of this, but are not a complete list.

VOS_DOS_WINDOWS16
The file was designed for 16-bit Windows running on MS-DOS.
VOS_DOS_WINDOWS32
The file was designed for 32-bit Windows running on MS-DOS.
VOS_NT_WINDOWS16
The file was designed for Windows NT.
VOS_OS216_PM16
The file was designed for 16-bit Presentation Manager running on 16-bit OS/2.
VOS_OS232_PM32
The file was designed for 32-bit Presentation Manager running on 32-bit OS/2.


 
KilkennyCat ©   (2006-07-28 02:17) [18]

все равно. VOS__BASE опять забыт. ;))


 
Шпиён   (2006-07-28 02:41) [19]

и чем он отличается от VOS_UNKNOWN?
ps я знаю, что Земля не круглая -)


 
KilkennyCat ©   (2006-07-28 02:47) [20]

Тем, что определен. Анноу - это признание в слабости, а бэйз - это твердо.


 
Chort ©   (2006-07-28 12:56) [21]

Насчет управления этими данными: мне нужно вставлять эти данные в базу данных Access ,и  это будет отображатся в сетке DBGrid1


 
Пусик ©   (2006-07-28 13:32) [22]


> <Цитата>
>
>
> Chort ©   (28.07.06 12:56) [21]
> Насчет управления этими данными: мне нужно вставлять эти
> данные в базу данных Access ,и  это будет отображатся в
> сетке DBGrid1


Ну так вставляй и отображай. Вопрос-то в чем?


 
Chort ©   (2006-07-28 14:26) [23]

to Пусик
Как?


 
Мефисто   (2006-07-28 14:30) [24]


> Chort ©   (28.07.06 14:26) [23]


- А вы и пироги за меня есть будете?
- Ага!

Двое из ларца (с)


 
Пусик ©   (2006-07-28 15:36) [25]


> Chort ©   (28.07.06 14:26) [23]
> to Пусик Как?


А это уже для другой темы вопрос - для отдельной ветки.


 
Chort ©   (2006-07-28 16:18) [26]

Ну а я думал что этот форум для начинающих (для Мефисто). Спасибо, помогли :o(


 
Мефисто   (2006-07-28 16:34) [27]


> Chort ©   (28.07.06 16:18) [26]


Форум для начинающих (да и другие) не подразумевает, что за вас будут писать ПО. На форум приходят обсудить/решить возникшую проблему, а не сделайте все за меня.

По постам выше, как получить требуемое инфо уже дано. Остается только раскидать полученные данные куда требуется. По сие случаю возникает вопрос: в чем проблема и что не получается?


 
Chort ©   (2006-07-28 16:48) [28]

Код почему-то не компилится.[10]


 
Мефисто   (2006-07-28 16:52) [29]


> Chort ©   (28.07.06 16:48) [28]


Компонент TTelepator не установлен...

Что Delphi говорит? На что ругается?


 
Chort ©   (2006-07-28 17:41) [30]

Что за компонент TTelepator ?
А делфи ругается на многое.Короче говоря не находит 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);
и так далее...Не может их распознать


 
Мефисто   (2006-07-28 18:16) [31]

uses SysUtils?

Тебе выше выложили полностью рабочий код для извлечения нужной инфы.
Проверь все ли библиотеки uses подцеплены. Если ругается, значит ты что-то напортачил.

>> Что за компонент TTelepator ?
Компонент отвественный за телепатию. Он же ошибка в 17 строке.
Имелось ввиду, что телепатов на форуме нет. Следовательно без приведения сообщения об ошибке (Chort  ©   (28.07.06 16:48) [28] ) ни кто ни чего путнего не посоветует.


 
Chort ©   (2006-07-28 20:01) [32]

Нашел ошибку! теперь все прекрасно компилируется и запускается.Всем огромное спасибо(особенно Мефисто и Шпиён). Но как можно  проверить работоспособность, ведь запускается пустая форма?


 
PSPF2003 ©   (2006-07-28 20:03) [33]

Хмык...............


 
PSPF2003 ©   (2006-07-28 20:07) [34]

Так  и вирус впарить можно.....


 
Chort ©   (2006-07-28 20:09) [35]

to PSPF2003
тоесть?
Еще раз повторюсь, что я новичек в этом деле!


 
PSPF2003 ©   (2006-07-28 20:14) [36]


> тоесть?Еще раз повторюсь, что я новичек в этом деле!

То есть ты скопировал с форума код. Который не понимаешь. Ты не боишься что тебе так вирус впарят когда-нибудь.


 
Мефисто   (2006-07-28 20:23) [37]


> PSPF2003 ©   (28.07.06 20:14) [36]


:)


> Chort ©   (28.07.06 20:09) [35]


 var
   A: TVerInfoRes;
begin
 A := TVerInfoRes.Create("C:\MyEXE.exe");
 try
   Label1.Caption := A.GetPreDefKeyString(viFileVersion);
 finally
   A.Free;
 end;
end;

P.S.
Но всетаки рекомендуем постигать азы начать с книжек, а не сразу с форума.


 
Chort ©   (2006-07-28 21:03) [38]

чтото творится непонятное: стоит мне положить на форму любой из компонентов , как он прописывается в самое начало кода(к примеру кладу OpenDialog1):
OpenDialog1: TOpenDialog;unit VerInfo;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, WinTypes, StdCtrls, Buttons;

type

EVerInfoError   = class(Exception);
ENoVerInfoError = class(Exception);
....

и пишет ошибку : "error in module VerInfo: Module header is missing or incorrect"
отсутствует заголовок модуля!


 
Мефисто   (2006-07-28 21:09) [39]

Я конечно много чего слышал. Но чтобы такое... Что-то тут нечисто.


 
PSPF2003 ©   (2006-07-28 21:14) [40]


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

В смысле тут не чисто? Тут как раз все чисто. Я тебе просто говорил, что нельзя тупо копировать код. Для того чтобы вывести систему из строя (Windows) достаточно изменить настройки в реестре , а сделать это можно всего несколькими строчками кода.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.04 c
2-1154607940
FFFF
2006-08-03 16:25
2006.08.27
Размер отчета


4-1146539224
Yus
2006-05-02 07:07
2006.08.27
DCB.flags


2-1155146708
Hgr
2006-08-09 22:05
2006.08.27
Текст письма


15-1154611414
Mike Kouzmine
2006-08-03 17:23
2006.08.27
Мобильная технология AMD Turion™ 64 X2


2-1155025590
ttt_111
2006-08-08 12:26
2006.08.27
Работа со сканером штрих-кода.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский