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

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

Как получить версию своей программы.


Kolan ©   (2008-01-14 10:12:00) 

То, что в Version info в настройках проекта указывается?


pathfinder   (2008-01-15 17:12:00) [1]


> Kolan ©   (14.01.08 11:37) [10]


Есть функция в sysutils, может подойдет..

function GetFileVersion(const AFileName: string): Cardinal;

Description
GetFileVersion returns the most significant 32 bits of a file binary version number.


Kolan   (2008-01-15 10:44:00) [2]

> [8] Slym ©   (14.01.08 11:16)

Работает — благодарю.


Kolan   (2008-01-14 11:37:00) [3]

Странно, мне кажется у какого-нибудь TApplication должны быть готовые св-ва для чтения версии…


Kolan   (2008-01-14 11:35:00) [4]

> [8] Slym ©   (14.01.08 11:16)

Размер радует, шас попробую…


Slym   (2008-01-14 11:16:00) [5]

function GetFileVersion(const FileName:string):string;
var
 DataSize:LongWord;
 pVerInfo,pData: Pointer;
 Translation:string;
begin
 result:='';
 DataSize:=0;
 DataSize:=GetFileVersionInfoSize(PChar(FileName),DataSize);
 if DataSize=0 then Exit;
 GetMem(pVerInfo, DataSize);
 try
   if GetFileVersionInfo(Pchar(FileName),0,DataSize,pVerInfo) then
   begin
     if VerQueryValue(pVerInfo, '\VarFileInfo\Translation', pData, DataSize) and (DataSize=SizeOf(LongWord)) then
       Translation:=IntToHex(MakeLong(HiWord(PLongWord(pData)^), LoWord(PLongWord(pData)^)), 8)
     else
       exit;
     if VerQueryValue(pVerInfo,PChar('\StringFileInfo\'+Translation+'\FileVersion'),pData,DataSize) then
       SetString(result,PChar(pData),DataSize);
   end;
 finally
   FreeMem(pVerInfo);
 end;
end;


Slym   (2008-01-14 10:54:00) [6]

про TranslationString забыл :(


Slym   (2008-01-14 10:52:00) [7]

Ditrix ©   (14.01.08 10:36) [3]
многа букаф :)
function GetFileVersion(const FileName:string):string;
var
 VerSize,Zero:LongWord;
 VerPtr,pData: Pointer;
 DataSize: LongWord;
begin
 result:='';
 Zero:=0;
 VerSize:=GetFileVersionInfoSize(PChar(FileName),Zero);
 if VerSize=0 then Exit;
 GetMem(VerPtr, verSize);
 try
 if GetFileVersionInfo(Pchar(FileName),0,VerSize,VerPtr) then
   if VerQueryValue(verPtr,'\\StringFileInfo\\041904E3\\FileVersion',pData,DataSize) then
     SetString(result,PChar(pData),DataSize);
 finally
   FreeMem(verPtr);
 end;
end;


oxffff   (2008-01-14 10:46:00) [8]


> oxffff ©   (14.01.08 10:45) [4]


Это шутка. :)


oxffff   (2008-01-14 10:45:00) [9]


> // В качестве параметра задать имя программы, если своей
> программы:
>
> FileVersion(Paramstr(0));


Тогда проще зайти в опции проекта и посмотреть.


Kolan   (2008-01-14 10:36:00) [10]

> См. PE HEADER

Я ессно нашел примеры вроде этого:
http://www.delphisources.ru/pages/faq/base/file_version_info.html

Нельзя ли это сделать проще?


Ditrix   (2008-01-14 10:36:00) [11]

function FileVersion(AFileName: string): string;
var
 szName: array[0..255] of Char;
 P: Pointer;
 Value: Pointer;
 Len: UINT;
 GetTranslationString: string;
 FFileName: PChar;
 FValid: boolean;
 FSize: DWORD;
 FHandle: DWORD;
 FBuffer: PChar;
begin
 try
   FFileName := StrPCopy(StrAlloc(Length(AFileName) + 1), AFileName);
   FValid := False;
   FSize := GetFileVersionInfoSize(FFileName, FHandle);
   if FSize > 0 then
   try
     GetMem(FBuffer, FSize);
     FValid := GetFileVersionInfo(FFileName, FHandle, FSize, FBuffer);
   except
     FValid := False;
     raise;
   end;
   Result := '';
   if FValid then
     VerQueryValue(FBuffer, '\VarFileInfo\Translation', p, Len)
   else
     p := nil;
   if P <> nil then
     GetTranslationString := IntToHex(MakeLong(HiWord(Longint(P^)),
       LoWord(Longint(P^))), 8);
   if FValid then
   begin
     StrPCopy(szName, '\StringFileInfo\' + GetTranslationString +
       '\FileVersion');
     if VerQueryValue(FBuffer, szName, Value, Len) then
       Result := StrPas(PChar(Value));
   end;
 finally
   try
     if FBuffer <> nil then
       FreeMem(FBuffer, FSize);
   except
   end;
   try
     StrDispose(FFileName);
   except
   end;
 end;
end;

// В качестве параметра задать имя программы, если своей программы:

FileVersion(Paramstr(0));


oxffff   (2008-01-14 10:34:00) [12]

См. PE HEADER

44h  Word  USER Major
46h  Word  USER Minor


Наверх

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