Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
m52 Member Откуда: Сообщений: 746 |
Здравствуйте, Delphi XE7 Функция, которая расположена ниже, получает Major,Minor,Release,Build из exe-файла. Т.е. информацию о версии. Как можно допилить эту ф-цию, чтобы она еще получала ProductName, т.е. вытаскивала название программы? function GetVersionInfo(fullpath: string; var Major,Minor,Release,Build,ProductName: string): boolean; var VerInfoSize: Cardinal; VerValueSize: Cardinal; Dummy: Cardinal; PVerInfo: Pointer; PVerValue: PVSFixedFileInfo; begin Result := false; VerInfoSize := GetFileVersionInfoSize(PChar(fullpath), Dummy); if VerInfoSize > 0 then begin GetMem(PVerInfo, VerInfoSize); try if GetFileVersionInfo(PChar(fullpath), 0, VerInfoSize, PVerInfo) then begin if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then begin Major := IntToStr(HiWord(PVerValue^.dwFileVersionMS)); Minor := IntToStr(LoWord(PVerValue^.dwFileVersionMS)); Release := IntToStr(HiWord(PVerValue^.dwFileVersionLS)); Build := IntToStr(LoWord(PVerValue^.dwFileVersionLS)); end; Result := true; end; finally FreeMem(PVerInfo, VerInfoSize); end; end; end; |
17 авг 15, 12:26 [18028165] Ответить | Цитировать Сообщить модератору |
DarkMaster Member Откуда: Donetsk,Ukraine Сообщений: 6438 |
m52, А вот нефиг то, что по первой ссылке Гугл выдал, сразу в код тащить - можно и на другие ссылки посмотреть: тут к примеру |
17 авг 15, 13:05 [18028434] Ответить | Цитировать Сообщить модератору |
m52 Member Откуда: Сообщений: 746 |
Спасибо. Что-то я не смог допилить этот вариант. Но зато починил свой старый вариант и получилось нечто такое: function GetVersionInfo(fullpath: string; var Major,Minor,Release,Build,ProductName: string): boolean; // Вх. fullpath - полный путь к EXE-файлу // Вых. - true, значит все ОК. Возвращаются значения Major,Minor,Release,Build,ProductName var VerInfoSize: Cardinal; Len: DWORD; Buff,TranslateBuffer: PChar; Value: PChar; Temp: integer; CalcLangCharSet: string; ProductVersion: string; begin result:=false; Major:='0'; Minor:='0'; Release:='0'; Build:='0'; ProductVersion:='0.0.0.0'; ProductName:=''; Len := GetFileVersionInfoSize(PChar(Application.ExeName), Len); if Len <=0 then exit; Buff := AllocMem(Len); try if GetFileVersionInfo(PChar(Application.ExeName), 0, Len, Buff) then // определим язык CalcLangCharSet // CalcLangCharSet:='040904E3'; VerQueryValue(Buff, '\VarFileInfo\Translation', pointer(TranslateBuffer), Len); if Len >= 4 then begin temp:=0; StrLCopy(@temp, TranslateBuffer, 1); CalcLangCharSet:=IntToHex(temp, 4); StrLCopy(@temp, TranslateBuffer+1, 1); CalcLangCharSet := CalcLangCharSet + IntToHex(temp, 4); end else exit; // Достаем название ПО if VerQueryValue(Buff, PChar('StringFileInfo\'+CalcLangCharSet+'\ProductName'), Pointer(Value), Len) then ProductName := Value else exit; // Достаем версию в виде '4.2.0.0' if VerQueryValue(Buff, PChar('StringFileInfo\'+CalcLangCharSet+'\ProductVersion'), Pointer(Value), Len) then ProductVersion := Value else exit; // Парсим версию на составляющие Major:=copy(ProductVersion, 1, pos('.',ProductVersion)-1); delete(ProductVersion, 1, pos('.',ProductVersion)); Minor:=copy(ProductVersion, 1, pos('.',ProductVersion)-1); delete(ProductVersion, 1, pos('.',ProductVersion)); Release:=copy(ProductVersion, 1, pos('.',ProductVersion)-1); delete(ProductVersion, 1, pos('.',ProductVersion)); Build:=ProductVersion; result:=true; finally FreeMem(Buff, Len); // освобождаем память end; end; |
17 авг 15, 14:28 [18028672] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15029 |
Вопрос по Линуксу. Т.к. GetFileVersionInfoSize использует WinAPI, то как быть в Линуксе? Или в линуксовом исполняемом бинарнике нет ничего такого про версии и информацию, которая есть в виндомом exe? Есть какая-то стандартная функция GetFileVersion, но они не кроссплатформенная. Сообщение было отредактировано: 17 фев 21, 10:14 |
17 фев 21, 10:20 [22282072] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||
17 фев 21, 10:26 [22282075] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15029 |
21 век, а в Delphi, которому уже 26 лет, до сих пор ничего готового нет в этом плане для Линукса:( |
17 фев 21, 10:45 [22282078] Ответить | Цитировать Сообщить модератору |
Гаджимурадов Рустам Member Откуда: Сообщений: 62404 |
X11> ничего готового нет в этом плане для Линукса:( Может есть. А может просто никому не нужно. Посмотри как в Лазарусе сделано. Posted via ActualForum NNTP Server 1.5 |
17 фев 21, 11:19 [22282101] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Delphi тут ни при чём. В линуксе исполняемые файлы не содержат информацию о версии. |
||||
17 фев 21, 12:05 [22282136] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15029 |
Ок, спасибо за информацию. |
17 фев 21, 12:12 [22282138] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 31969 |
в линухе тоже можно прилинковать как ресурс. per rectum, но можно. Posted via ActualForum NNTP Server 1.5 |
17 фев 21, 12:27 [22282155] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Мимопроходящий, Руками конечно можно. Там каждый ресурс отсвечивает в экспорте модуля :) |
17 фев 21, 12:48 [22282177] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Вот так можно сымитировать ресурс в линуксовом модуле:program Project1; uses System.Types; type TCustomRes = packed record size : UInt32; data : array[0 .. 3] of byte; end; var version : TCustomRes; exports version name '__rsrc_N6RCDATA7versionE'; begin version.size := 4; version.data[0] := 1; version.data[1] := 2; version.data[2] := 3; version.data[3] := 4; var res := FindResource(hInstance, 'version', RT_RCDATA); var ptr : PByte := Pointer(res); writeln(ptr[0], '.', ptr[1], '.', ptr[2], '.', ptr[3]); end. |
17 фев 21, 13:05 [22282209] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15029 |
зачем все эти сложности, если уже сымитировать можно проще - хранить в константе |
17 фев 21, 13:11 [22282223] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Код просто демонстрация, что для ресурсов используются механизмы экспорта символов. На самом деле, любую мету проще всего подключать именно ресурсом в пребилд ивенте. |
||||
17 фев 21, 13:17 [22282228] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 31969 |
17.02.2021 13:11, X11 пишет: > зачем все эти сложности, если уже сымитировать можно проще - хранить в константе ресурс можно извлечь "снаружи". а твою константу - нет. Posted via ActualForum NNTP Server 1.5 |
17 фев 21, 13:17 [22282229] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
21-й век, а в линуксе, которому уже тоже 25, так и не появилась информация о версии в исполняемых файлах. Posted via ActualForum NNTP Server 1.5 |
||
17 фев 21, 13:26 [22282240] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
В линуксе принято выдавать номер версии в консоль по ключу -v. |
17 фев 21, 13:42 [22282248] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Великолепно. Как мне запустить .so файл с ключом -v? Posted via ActualForum NNTP Server 1.5 |
17 фев 21, 13:43 [22282250] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6563 |
|
||||
17 фев 21, 13:44 [22282251] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Ну я и понимаю, что кучка гиков, пишущих по принципу "лишь бы не как у соседа" иначе не может. Posted via ActualForum NNTP Server 1.5 |
17 фев 21, 13:48 [22282256] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Обычно имя файла содержит версию + имеется символьная ссылка с именем без версии. |
17 фев 21, 13:53 [22282264] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
На самом деле, из имени файла версию получить сильно проще и быстрее, чем из ресурса (будь они в линуксе). |
||||
17 фев 21, 13:54 [22282266] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
Осталась сущая мелочь: обшмонать весь LD_LIBRARY_PATH и распарсить базу лоадера чтобы найти какое же имя имеет нужная библиотека на данной системе. Posted via ActualForum NNTP Server 1.5 |
||
17 фев 21, 13:59 [22282271] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Dimitry Sibiryakov, Реши ту же задачу на винде. |
17 фев 21, 14:08 [22282281] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52445 |
LoadLibrary() GetFileVersionInfo() Задача решена. Posted via ActualForum NNTP Server 1.5 |
17 фев 21, 14:16 [22282288] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
Dimitry Sibiryakov, Хм. Я тоже так могу. LoadLibrary GetModuleName |
17 фев 21, 14:24 [22282290] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15029 |
честно говоря, я немного в шоке |
||||||
17 фев 21, 14:56 [22282314] Ответить | Цитировать Сообщить модератору |
Kazantsev Alexey Member Откуда: Сообщений: 4987 |
X11, О, сколько нам открытий чудных... |
17 фев 21, 14:59 [22282319] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / Delphi | ![]() |