Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.01;
Скачать: CL | DM;

Вниз

Как получить версию приложения   Найти похожие ветки 

 
neveGreen   (2008-12-15 15:30) [0]

Как получить версию приложения которое исполняется и версию exe файла и сравнить их потом? Применяется для обновления программы.


 
Palladin ©   (2008-12-15 15:35) [1]

Function GetVersion(Const S:String;Simple:Boolean=False):String;
Var
buf:Pointer;
nSize:Integer;
vi:^vs_fixedfileinfo;
p:pointer absolute vi;
l:cardinal;
l1,l2:cardinal;
vs1:array [1..2] of word absolute l1;
vs2:array [1..2] of word absolute l2;
Begin
nSize:=GetFileVersionInfoSize(PChar(S),l);
GetMem(buf,nSize);
Try
 GetFileVersionInfo(PChar(S),l,nSize,Buf);
 VerQueryValue(Buf,"\",p,l);
 l1:=vi.dwFileVersionMS;
 l2:=vi.dwFileVersionLS;
 If Simple
  Then Result:=IntToStr(vs1[2])+"."+IntToStr(vs1[1])+"."+IntToStr(vs2[2])+"."+IntToStr(vs2[1])
  Else Result:="v"+IntToStr(vs1[2])+"."+IntToStr(vs1[1])+" r"+IntToStr(vs2[2])+" b"+IntToStr(vs2[1]);
Finally
 FreeMem(buf);
End;
End;


 
tesseract ©   (2008-12-15 15:36) [2]


> Как получить версию приложения которое исполняется и версию
> exe файла


А это не одно и тоже случаем ?  смотри GetFileVersionInfo + VS_VERSIONINFO


 
KilkennyCat ©   (2008-12-15 15:51) [3]


> tesseract ©

вероятно, автор имеет ввиду данные текущего ехешника и нового.


 
neveGreen   (2008-12-15 15:56) [4]


> Palladin ©   (15.12.08 15:35) [1]

не работает


 
Palladin ©   (2008-12-15 15:58) [5]


> neveGreen   (15.12.08 15:56) [4]

ну прям как приговор, у меня уж три года как работает, а тут пришел индивидуум, приговорил, и даже, наверно в ФСБ работает, суть ошибки не раскрыл... от ведь... поколение секретов


 
neveGreen   (2008-12-15 15:59) [6]


> KilkennyCat ©   (15.12.08 15:51) [3]

Да, я имею ввиду текущей программой сравнить ее же обновление в другом каталоге, если версия в каталоге больше то текущую поменять. Надо определить текущую работающую версию "из нутри" и определить версию другого файла.


 
neveGreen   (2008-12-15 16:00) [7]


> neveGreen   (15.12.08 15:56) [4]

какая то ошибка при работе с version.dll


 
neveGreen   (2008-12-15 16:02) [8]

в строке l1 := vi.dwFileVersionMS;


 
Palladin ©   (2008-12-15 16:02) [9]

"какая то ошибка при работе с version.dll" может говорить лишь о том, что в ресурсах данных о версии не содержится.


 
Сергей М. ©   (2008-12-15 16:03) [10]


> какая то ошибка при работе с version.dll
>


Т.е. ты вызвал эту функцию и вместа ожидаемого результата увидел сообщение, дословно звучащее как "какая то ошибка при работе с version.dll", так ?


 
Anatoly Podgoretsky ©   (2008-12-15 16:10) [11]


> какая то ошибка при работе с version.dll

Странная у тебя система, и ругается больно зверски.


 
Anatoly Podgoretsky ©   (2008-12-15 16:10) [12]


> какая то ошибка при работе с version.dll

Странная у тебя система, и ругается больно зверски.


 
neveGreen   (2008-12-15 16:12) [13]


> Palladin ©   (15.12.08 16:02) [9]

точно не записано...
Большое спасибо, а не могли бы Вы вкратце объяснить алгоритм работы с памятью в этом примере.


 
tesseract ©   (2008-12-15 16:15) [14]


> Вы вкратце объяснить алгоритм работы с памятью в этом примере.


Смотрим GetFileVersionInfoSize - выделяем сколько она вернула, запускаем функцию, получаем данные, свобождаем буфер. Palladin забыл,  что  функция может вернуть нулевое значение и не проводит сравнение с нулем nSize. Всё.


 
Palladin ©   (2008-12-15 16:25) [15]


> neveGreen   (15.12.08 16:12) [13]

какой конкретно вопрос?


> Palladin забыл,  что  функция может вернуть нулевое значение

есть такое дело, только не забыл, а просто не стал проверять... обращаясь к функции, я всегда знаю, что информация о версии есть... хотя по хорошему, конечно надо... да и одна переменная, в принципе, лишняя..


 
neveGreen   (2008-12-15 16:29) [16]


> какой конкретно вопрос?

Объясните пожалуйста параметры функций
GetFileVersionInfo(PChar(S),l,nSize,Buf)  и
VerQueryValue не могу найти в хелпе


 
clickmaker ©   (2008-12-15 16:32) [17]

они в Win32 SDK reference


 
Palladin ©   (2008-12-15 16:34) [18]

PChar(s) - имя фала
l - не значит ничего, просто заглушка, но по задумке MS там должно быть значение полученное при GetFileVersionInfoSize
nSize - размер блока данных версии, полученный GetFileVersionInfoSize
buf - указатель по которому нужно расположить данные версии


> VerQueryValue не могу найти в хелпе

эти функции принадлежат Window SDK, в соответствующей справке и ищи


 
neveGreen   (2008-12-15 17:10) [19]

Благодарю. А еще такой ворос - фактически функция сравнения может сравнить на ">" две полученных строки - строки версии текущего приложения и строки версии другого exe файла.

function VersionCompire(NewVersion, CurrVersion: String): Boolean;
begin
 if NewVersion > CurrVersion then
   Result := True
 else
   Result := False;
end;


 
Palladin ©   (2008-12-15 17:18) [20]

Зачем тебе строки сравнивать? Сравнивай значения версий. Я функцию для примера привел, как получить информации о версии.


 
neveGreen   (2008-12-15 17:21) [21]


> Palladin ©   (15.12.08 17:18) [20]

Дак я передаю в нее Simple= True и сравниваю результаты, тоесть строки в формате x.x.x.x - или Вы знаете проще способ?


 
Palladin ©   (2008-12-15 17:24) [22]

версия хранится в двух значениях cardinal, а тип int64, как бы совершенно случайно, размером в 8 байт...


 
neveGreen   (2008-12-15 18:07) [23]

Чтото типа такого?:

   ver : Int64;
Begin
 nSize := GetFileVersionInfoSize(PChar(S),l);
 GetMem(Buf,nSize);
 Try
   GetFileVersionInfo(PChar(S),l,nSize,Buf);
   VerQueryValue(Buf,"\",p,l);
   ver := Buf;
   Result := ver;


 
Anatoly Podgoretsky ©   (2008-12-15 18:12) [24]

> neveGreen  (15.12.2008 17:21:21)  [21]

Я знаю, что данный путь дает неверные результаты в некоторых случаях. Бессмысленно сравнивать строки и делать из этого арифметические выводы, очень бессмысленно.


 
tesseract ©   (2008-12-15 18:17) [25]


> Я знаю, что данный путь дает неверные результаты в некоторых
> случаях.


Он в некоторых случаях даст верные результаты для строк. Если мне не изменяет память "1.2.12"  будет больше "1.21.1". Т.К код для "." больше по номеру.


 
neveGreen   (2008-12-15 18:39) [26]


> Anatoly Podgoretsky ©   (15.12.08 18:12) [24]

"Делать арифметические выводы из сравнения строк" я бы назвал неправильным в данном случае, даже уродливым, но у меня не получаеся подругому... (


 
Anatoly Podgoretsky ©   (2008-12-15 20:36) [27]

> tesseract  (15.12.2008 18:17:25)  [25]

За тр 1.10.12 будет меньше этих двух.


 
Anatoly Podgoretsky ©   (2008-12-15 20:38) [28]

> neveGreen  (15.12.2008 18:39:26)  [26]

Хочешь правильный результат = преобразуй составляющие в числа


 
neveGreen   (2008-12-16 00:38) [29]

А как лучше возвращать массив с четырьмя элементами или както через параметры?


 
Германн ©   (2008-12-16 00:57) [30]


> neveGreen   (16.12.08 00:38) [29]
>
> А как лучше возвращать массив с четырьмя элементами или
> както через параметры?
>

Монопенисуально.
(с) Digitman


 
neveGreen   (2008-12-16 01:01) [31]

Чувствую я уже достал )


 
Германн ©   (2008-12-16 01:33) [32]


> neveGreen   (16.12.08 01:01) [31]
>
> Чувствую я уже достал )
>

Нет. (Пока ещё нет). Ты пока вполне адекватен. А если ты воспринял мой пост [30] как нечто касающееся именно и только тебя, то забудь его.
А ответ [30] я запостил просто по тому, что "ностальгия", пардон. :)


 
Германн ©   (2008-12-16 01:36) [33]

Лишний пробел вставил нечаянно. :(


 
neveGreen   (2008-12-16 10:14) [34]

да вот с указателями у меня напряг - понимаю вот из, а пользоваться не могу, опереторов не хватает... 8 байт это круто - а знаю адресс ячейки, а забрать от туда не знаю как.......(


 
Palladin ©   (2008-12-16 10:29) [35]

Ох ты"ж господи ты боже мой....

Function CompareInt64VersionInfoBytes(n1,n2:Int64):Integer;
Var
 i1:Int64Rec Absolute n1;
 i2:Int64Rec Absolute n2;
Begin
 Result:=i1.Words[1]-i2.Words[1];
 If Result=0 Then Result:=i1.Words[0]-i2.Words[0];
 If Result=0 Then Result:=i1.Words[3]-i2.Words[3];
 If Result=0 Then Result:=i1.Words[2]-i2.Words[2];
End;

Function GetVersion(Const S:String):Int64;
Var
 buf:Pointer;
 nSize:Integer;
 vi:^vs_fixedfileinfo;
 p:pointer absolute vi;
 l:cardinal;
Begin
 nSize:=GetFileVersionInfoSize(PChar(S),l);
 If nSize=0 Then RaiseLastOSError;
 GetMem(buf,nSize);
 Try
  If Not GetFileVersionInfo(PChar(S),l,nSize,Buf) Then RaiseLastOSError;
  VerQueryValue(Buf,"\",p,l);
  Int64Rec(Result).Hi:=vi.dwFileVersionMS;
  Int64Rec(Result).Lo:=vi.dwFileVersionLS;
 Finally
  FreeMem(buf);
 End;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(CompareInt64VersionInfoBytes(
 GetVersion("project2.exe"),
 GetVersion("project3.exe")
)));
end;


 
neveGreen   (2008-12-16 11:41) [36]

Большое спасибо ) Да мне надо подтянуть работу со ссылками на память... И вообще, что я за программист, это ж основное?


 
clickmaker ©   (2008-12-16 11:54) [37]

если номер билда сквозной и увеличивается в новой версии, то достаточно сравнивать vs2[1]


 
tesseract ©   (2008-12-16 12:11) [38]


> neveGreen   (16.12.08 11:41) [36]


Первый за две недели вежливый начинающий. Уже отвыкли от таких :-)

Подтягивай на здоровье : http://www.bolero.ru/person-233830.html


 
Palladin ©   (2008-12-16 12:23) [39]


> Первый за две недели вежливый начинающий.

и не говори... +пытающийся что то понять...
такому даже пример можно написать, не поленится... зная, что за даром врядли пропадет...


 
neveGreen   (2008-12-16 14:41) [40]

да я просто сам даю советы, только по другому языку на другом сайте, и знаю, какие пользователи порой бывают, а бывают они порой очень уж не важные... бывало хотелось разбабарать пользователю чтото, когда в вдадцатом твоем посте ты стараешься изо всех сил заставить его сделать правильно, а он строит умника нефига при этом не понимая вообще... ну это уже другая история...


 
neveGreen   (2008-12-18 20:56) [41]


> tesseract ©   (16.12.08 12:11) [38]

чёрт, обалденная книга...



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

Текущий архив: 2009.02.01;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.014 c
11-1197059646
Сергей
2007-12-07 23:34
2009.02.01
Скрол для KOLGrushPanel


15-1228228702
kaif
2008-12-02 17:38
2009.02.01
В Китае Минкульт намерен запретить петь под фонограмму


1-1207680923
@!!ex
2008-04-08 22:55
2009.02.01
Использование 7z


2-1229435530
nonamez11
2008-12-16 16:52
2009.02.01
поиск в строке


15-1228719875
pavel_guzhanov
2008-12-08 10:04
2009.02.01
Как отключить оптимизатор в Delphi7