Главная arrow Лаборатория arrow Узнать свою версию  
06.09.2010
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Поиск
Новости
Лента новостей
Новости Delphi
Новости проекта
Новости инструментов
Разные новости
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Каталог@Mail.ru - каталог ресурсов интернет
комментарии
Узнать свою версию Версия для печати
Рейтинг: / 8
ХудшаяЛучшая 
Написал Snowy   
06.06.2007
Предлагаю вариант кода, позволяющий быстро и просто узнать версию своей программы.
Обычно используют общий код, для извлечения версии, пробега по полям и т.д... Но, если нужно узнать номер версии своей программы, то всё гораздо проще. Версия программы хранится в ресурсах. VERSIONINFO своей программы можно извлечь из ресурса с именем '#1'. В данном ресурсе версия программы всегда хранится по смещению 49. Вот пример кода, который достаёт версию из себя:
function GetMyVersion:string;
type
  TVerInfo=packed record
    Nevazhno: array[0..47] of byte; // ненужные нам 48 байт
    Minor,Major,Build,Release: word; // а тут версия
  end;
var
  s:TResourceStream;
  v:TVerInfo;
begin
  result:='';
  try
    s:=TResourceStream.Create(HInstance,'#1',RT_VERSION); // достаём ресурс
    if s.Size>0 then begin
      s.Read(v,SizeOf(v)); // читаем нужные нам байты
      result:=IntToStr(v.Major)+'.'+IntToStr(v.Minor)+'.'+ // вот и версия...
              IntToStr(v.Release)+'.'+IntToStr(v.Build);
    end;
  s.Free;
  except; end;
end;
опубликовано
Добавить новыйПоиск
Alix   2008-03-18 12:49:01
А зачем читать 48 ненужных байт, почему бы просто не использовать position у stream?
Snowy   2008-03-18 15:48:50
Просто так операция делается за один раз - прочитали и всё.
Хотя никто не запрещает модернизировать код. Вариантов реализации можно придумать много. Это лишь один из них, как рабочий пример.
лолик   2008-03-20 17:39:21
цитата:
Это лишь один из них, как рабочий пример

Как один из самых убогих)
Snowy   2008-03-20 21:21:07
Не убогий, а тупо прямолинейный.
Решение задачи влоб.
Можно было и поизящней нарисовать, но какой был, такой и дал.
Решить задачу можно по разному, результат один.
Незачем критиковать код. Он нормально работает и основной принцип показывает.
Да, далеко не самая красивая реализация.
Но рисовать красивую было лень :)
лолик)))   2008-03-28 16:01:36
^^
а на Pure API слабо? = ) Докажи что ты нормальный одмен =)))
aktuba     2008-04-08 03:20:34
Почему тебе кто-то что-то должен доказывать? Тебе надо - ты и доказывай, что что-то не так.

P.S.: код действительно хорош, т.к. очень просто решает свою задачу.
лолик))   2008-04-13 03:52:37
2aktuba
код говно (истенное (не(!) в обиду Snowy)), т.к. юзает убогие классы Борлондовской ртл.

код:
function  DllVersion(FileName:
 
 PWideChar): Boolean;
var
  Size, Size2: LongWord;
  Pt, Pt2: Pointer;
begin
    Result:=False;
     Size:=GetFileVersion
 
 InfoSizeW(FileName,S
 
ize2);
    if Size>0 then
    begin
      GetMem(Pt,Size);
      try
         GetFileVersionInfoW(
 
 FileName,0,Size,Pt);
        VerQueryValueW(Pt,'\',Pt2,Size2);
        with  TVSFixedFileInfo(Pt2
 
^) do begin
           HiWord(dwFileVersion
 
MS) //мажор
           LoWord(dwFileVersion
 
MS) //минор
           HiWord(dwFileVersion
 
LS) //релизенг
           LoWord(dwFileVersion
 
LS) //билд
        end;
        Result:=True;
      finally
        FreeMem(Pt,Size);
      end;
    end;
end;


з.ы. ц++ рулит)
лолик))   2008-04-13 03:54:13
ппц. бедный кодес как расплющело :(
Snowy   2008-04-14 13:24:43
Нормальные у кодгира классы. Не нравится - не ешь. Пиши на ц++
А твой код работает по общему принципу.
Подобное решение есть и в спраке дельфи.
Фишка моего кода как раз в другом - получение своей версии из своего ресурса, а не обращение к своему файлу, как к постороннему.
Мой код показывает именно это.
aktuba - Вот где код = говно     2008-04-15 15:22:02
Использовать в Delphi вместо RTTI WinAPI далеко не всегда хорошо. Как раз, как в данном случае. Столько кода, а результат тот-же :!:
xfree   2008-05-07 10:13:47
Похоже, у вас разборки студентов 1-курсников :D
txb   2008-06-09 10:08:37
В споре рождается истина...., но не всегда :)
Оба примера хороши. Программист сам выберет нужный ему код, относительно решаемой им задачи. :)
Спасибо
Step   2008-12-20 19:32:39
конечно первый вариант выглядит привлекательно, но без таких вещей как try except выглядит первобытным.
AlexAR - RT_VERSION и RT_XXX в 7-ке не   2009-03-22 09:49:46
Что-то неправильное происходит - в Хелпе - перечислены ключи типов ресурсов, а в самой Дельфи - нет.... 8о

В конструкторе TResourceStream.Create просто заполняется внутреннее поле ResType: PChar.
Нигде этот ResType не сравнивается, а просто вызывается Kernel32-функция FindResource и ей передается значение этого ключа (у нас - RT_VERSION)...

Подскажите, пожалуйста, где копать? Я буду рад даже за константу (PChar), чтобы вручную определить RT_VERSION
Анонимно   2010-06-05 21:03:29
где взять код для делфи 6? :?:
newbas - Вот еще вариант   2010-07-05 09:05:35
[code]
Function GetVersion:String;
const
InfoNum = 10;
InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName',
'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');

type
TLangChrSet = array[0..1] of word;
PLangChrset = ^TLangChrSet;

var
s, res: string;
n, Len, i: DWORD;
Buf: PChar;
Value: PChar;
LangChrSet: PLangChrSet;

begin
Res:='';
S := Application.ExeName;
n := GetFileVersionInfoSi
ze(PChar(S), n);
if n > 0 then
begin
Buf := AllocMem(n);
GetFileVersionInfo(P
Char(S), 0, n, Buf);
if VerQueryValue(Buf, PChar('VarFileInfo\Translation'), pointer(LangChrset),
Len) then
begin
s:=Format('%.4x%. 4x',[LangChrSet^[0],
LangChrSet^[1]]); // Определил кодовую страницу информации
i:=3; // FileVersion
if VerQueryValue(Buf, PChar('StringFileInf
o\' + s + '\' + InfoStr[i]), Pointer(Value), L...
vlad   2010-08-20 15:52:54
Вариант стартера имеет еще такое преимущество, как возможность получить версию при запакованном екзешнике.
Добавить комментарий
Имя:
Веб-сайт:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.   След. >