Форум: "Начинающим";
Текущий архив: 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.006 c