Текущий архив: 2003.01.20;
Скачать: CL | DM;
Вниз
Версия *.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;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.009 c