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

Вниз

Версия *.exe файла   Найти похожие ветки 

 
Извращенец2   (2002-11-06 15:02) [0]

Здравствуйте!
Как известно, в каждом *.exe файле есть метаинформация, т.е. информация о создателе, ВЕРСИИ, Даты создания и пр. Delphi, как приличная среда программирования позволяет задать эту метаинформацию для *.exe Вашего проекта(Project-Options-Compiler).
Так вот, теперь вопрос: Как можно вытащить эту информацию из уже скомпиленного *.exe? Например, для оперативного отображения версии программы в окне About:)
Заранее спасибо!


 
demoniada   (2002-11-06 15:06) [1]

ну, вообще-то это добро хранится в заголовке PE файла, если это действительно интересно... Каких-либо простых путей не знаю...


 
Извращенец2   (2002-11-06 15:11) [2]

demoniada,
Вот-вот, оттуда мне его и надо вытащить:)
Подозреваю, что есть какие-нибудь API-функции..


 
Игорь Шевченко   (2002-11-06 15:49) [3]

type
PVerLang = ^TVerLang;
TVerLang = record
Charset : Word;
LangID : Word;
end;

procedure TfrmMain.GetVersionAttributes(Name: String; var ACompany,
ADescription, AComment: String);

var VerInfoSize : DWord;
dummy : DWord;
VerInfo : Pointer;
VSFixed : PVSFixedFileInfo;
VSFixedSize : DWORD;
VTranslation : PVerLang;
VTRSize : DWORD;
LangID : String;
VerKey : String;
VerDesc : PChar;
VerDescSize : DWORD;
VerCompany : PChar;
VerCompanySize : DWORD;
VerComment : PChar;
VerCommentSize : DWORD;
Status : LongBool;
begin
ACompany := "<Not available>";
ADescription := "<Not available>";
AComment := "";
VerInfoSize := GetFileVersionInfoSize(PChar(Name), dummy);
if (VerInfoSize = 0) then
Exit;
GetMem( VerInfo, VerInfoSize );
try
Status := GetFileVersionInfo(PChar(Name), 0, VerInfoSize, VerInfo);
if NOT Status then
Exit;
VerQueryValue( VerInfo, "\", Pointer(VSFixed), VSFixedSize);
VerQueryValue( VerInfo, "\VarFileInfo\Translation", Pointer(VTranslation), VTRSize);
if (VTRSize = 4) then begin
LangID := Format("%.4x%.4x", [VTranslation^.CharSet, VTranslation^.LangID]);
VerKey := "\StringFileInfo\"+LangID+"\FileDescription";
Status := VerQueryValue (VerInfo,PChar(VerKey), Pointer(VerDesc), VerDescSize);
if (Status) AND (VerDescSize <> 0) then
ADescription := VerDesc;
VerKey := "\StringFileInfo\"+LangID+"\CompanyName";
Status := VerQueryValue (VerInfo,PChar(VerKey), Pointer(VerCompany), VerCompanySize);
if (Status) AND (VerCompanySize <> 0) then
ACompany := VerCompany;
VerKey := "\StringFileInfo\"+LangID+"\Comments";
Status := VerQueryValue (VerInfo,PChar(VerKey), Pointer(VerComment), VerCommentSize);
if (Status) AND (VerCommentSize <> 0) then
AComment := VerComment;
end;
finally
FreeMem(VerInfo, VerInfoSize);
end;
end;



 
Извращенец2   (2002-11-06 16:32) [4]

Вот, это уже более полезно:) Спасибо Игорю!


 
Извращенец2   (2002-11-06 16:55) [5]

Вот только конкретных цифр не видно:( Хотя название компании вижу:)


 
Игорь Шевченко   (2002-11-06 17:21) [6]

Конкретные цифры:

procedure GetFileVersion(FileName: string; var Major1, Major2,
Minor1, Minor2: Integer);
{ Helper function to get the actual file version information }
var
Info: Pointer;
InfoSize: DWORD;
FileInfo: PVSFixedFileInfo;
FileInfoSize: DWORD;
Tmp: DWORD;
begin
Major1 := 0;
Major2 := 0;
Minor1 := 0;
Minor2 := 0;
// Get the size of the FileVersionInformatioin
InfoSize := GetFileVersionInfoSize(PChar(FileName), Tmp);
// If InfoSize = 0, then the file may not exist, or
// it may not have file version information in it.
if InfoSize = 0 then
Exit;
// Allocate memory for the file version information
GetMem(Info, InfoSize);
try
// Get the information
GetFileVersionInfo(PChar(FileName), 0, InfoSize, Info);
// Query the information for the version
VerQueryValue(Info, "\", Pointer(FileInfo), FileInfoSize);
// Now fill in the version information
Major1 := FileInfo.dwFileVersionMS shr 16;
Major2 := FileInfo.dwFileVersionMS and $FFFF;
Minor1 := FileInfo.dwFileVersionLS shr 16;
Minor2 := FileInfo.dwFileVersionLS and $FFFF;
finally
FreeMem(Info, FileInfoSize);
end;
end;

....

if FileExists(Application.ExeName) then begin
GetFileVersion(Application.ExeName, VersionMajor, VersionMinor,
Release, BuildNumber);
cVersion.Caption := Format("Версия: %d.%d.%d (сборка %d)",
[VersionMajor, VersionMinor, Release, BuildNumber]);


 
Извращенец2   (2002-11-07 06:14) [7]

Большое спасибо:)


 
NickBat   (2002-11-07 11:09) [8]

> Так вот, теперь вопрос: Как можно вытащить эту информацию из уже
> скомпиленного *.exe? Например, для оперативного отображения
> версии программы в окне About:)

Для отражения версии программы добавить в эту самую программу две страницы кода???
- Ну вы блин даете! :)))
Не проще в окне About, ручками набрать одну строку:
Label1.Caption:="My Programm - ver. 1.0";

PS: Надеюсь About отражает информацию о своей программе? В основном это так.


 
Игорь Шевченко   (2002-11-07 11:29) [9]

NickBat © (07.11.02 11:09)

Это вы блин даете.


 
Извращенец2   (2002-11-07 15:05) [10]

NickBat,
а если ты постоянно совершенствуешь свою прогу? и поставляешь новые версии? Каждый раз возвращаться к About и писать ручками? Не есть гуд:) Игорь предложил красивое решение, вот только его(решение) покоцать немного надо:) И получится не так уж много...
Считаю вопрос закрытым...


 
NickBat   (2002-11-07 15:19) [11]

Решение красивое, не спорю. Но считаю, что версии программы ты не каждый час обновляешь и, наверняка, не каждый день, да и версия раз в неделю - не есть хорошо. :)))


 
Игорь Шевченко   (2002-11-07 16:03) [12]

NickBat © (07.11.02 15:19)

Ошибки в программе исправляются. Часто или редко - не важно. При изменении версия сама меняется (по настройкам проекта). Отсылается заказчику. Заказчик задает вопрос, а ему встречный вопрос: открой About, скажи версию. И заказчику удобно и разработчику.


 
Tano   (2002-11-08 22:06) [13]

Альтернатива (по мативам Helpа Delphi). Возвращает строку номера версии "major.minor.release.build":

function TFormMain.GetMyFileVersion :String;
var
S: string;
n, Len :DWORD;
Buf :PChar;
Value :PChar;
begin
GetMyFileVersion:="";
S:=Application.ExeName;
n:=GetFileVersionInfoSize(PChar(S), n);
if n>0 then
begin
Buf := AllocMem(n);
if GetFileVersionInfo(PChar(S), 0, n, Buf) then
if VerQueryValue(Buf, "StringFileInfo\041904E3\FileVersion", Pointer(Value), Len) then
GetMyFileVersion:=Value;
FreeMem(Buf, n);
end;
end;


Здесь цифры - код языка приложения (можно увидеть в конце EXE файла), вместо FileVersion можно писать названия полей VersionInfo.
Корявенькая функция, написал на скорую руку, попав в ситуацию
> Игорь Шевченко ©
:-)



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

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

Наверх





Память: 0.48 MB
Время: 0.136 c
1-62505
dinn
2003-01-10 14:14
2003.01.20
RichEdit и align justify


1-62499
tytus
2003-01-09 20:52
2003.01.20
Stringgrid & Combobox


14-62730
plugin
2003-01-04 08:56
2003.01.20
Чё то я не понял...


14-62803
Артём К
2002-12-30 07:28
2003.01.20
Новогоднее поздравление!!!


14-62776
Swinger
2002-12-17 23:57
2003.01.20
Поддержим Россию! :)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский