Главная arrow Лаборатория arrow Узнать свою версию  
06.02.2012
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Ссылки
Поиск
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Авторизация





Забыли пароль?
Вы не зарегистрированы. Регистрация
Каталог@Mail.ru - каталог ресурсов интернет
Узнать свою версию Версия для печати
Рейтинг: / 12
ХудшаяЛучшая 
Написал 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:=GetFileVersionInfoSizeW(FileName,Size2);
    if Size>0 then
    begin
      GetMem(Pt,Size);
      try
        GetFileVersionInfoW(FileName,0,Size,Pt);
        VerQueryValueW(Pt,'\',Pt2,Size2);
        with TVSFixedFileInfo(Pt2^) do begin
          HiWord(dwFileVersionMS) //мажор
          LoWord(dwFileVersionMS) //минор
          HiWord(dwFileVersionLS) //релизенг
          LoWord(dwFileVersionLS) //билд
        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
код:
 
 
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 := GetFileVersionInfoSize(PChar(S), n);
 
  if n > 0 then
 
    begin
 
      Buf := AllocMem(n);
 
      GetFileVersionInfo(PChar(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('StringFileInfo\' + s + '\' + InfoStr[i]), Pointer(Value), Len) then
 
            res:=Value;
 
        end;
 
      FreeMem(Buf, n);
 
    end;
 
  Result:=res;
 
end;
 
vlad   2010-08-20 15:52:54
Вариант стартера имеет еще такое преимущество, как возможность получить версию при запакованном екзешнике.
Давид Шекельбаум   2011-01-12 14:56:30
> а на Pure API слабо? = )

Ну берём и дословно переписываем код ОПа, глядя в исходники VCL:

код:
 
function GetMyVersion: string;
type
  TV = array [0 .. 3] of smallint;
var
  HR: HRSRC;
  H: THandle;
  C: ^TV;
begin
  HR := FindResource(MainInstance, '#1', rt_Version);
  H := LoadResource(MainInstance, HR);
  integer(c) := integer(LockResource(H)) + 48;
  Result := IntToStr(C[1]) + '.' + IntToStr(C[0]) + '.' + IntToStr(C[3]) + '.' + IntToStr(C[2]);
  UnlockResource(H);
  FreeResource(H);
end;


> код говно (истенное (не(!) в обиду Snowy)), т.к. юзает убогие классы Борлондовской ртл.

Ага, вместо этого ты предлагаешь ещё большее говно, которое лишний раз загружает версию программы с винта. Зачем винт мучать?

> з.ы. ц++ рулит)

лолик...
Caster   2011-12-28 15:05:25
Я бы даже сказал так
код:
 
function GetMyVersion: string;
type
  TV=array [0..3] of smallint;
var
  HR: HRSRC;
  H: THandle;
  C: ^TV;
begin
  HR:=FindResource(MainInstance, '#1', rt_Version);
  H:=LoadResource(MainInstance, HR);
  Integer(C):=Integer(LockResource(H))+48;
  Result:=IntToStr(word(C[1]))+'.'+IntToStr(word(C[0]))+'.'+IntToStr(word(C[3]))+'.'+IntToStr(word(C[2]));
  UnlockResource(H);
  FreeResource(H);
end;

потому как номер версии и билда может уйти в отрицательное значение.
комментарии
Имя:
Заголовок:
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
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.   След. >