Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.02.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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]

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



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

Форум: "Начинающим";
Текущий архив: 2009.02.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.008 c
15-1228377608
pasha_golub
2008-12-04 11:00
2009.02.01
Delphi 7 вываливается


2-1229427507
charoey_mag
2008-12-16 14:38
2009.02.01
Чтение в record


1-1206708636
Jolik
2008-03-28 15:50
2009.02.01
какие накладные расходы у try except end?


2-1229432916
девушка
2008-12-16 16:08
2009.02.01
DevExpress properties


2-1229861533
flunkkkk
2008-12-21 15:12
2009.02.01
доработка в программе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский