Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Delphi как узнать версию файла


Помогите!!! Как узнать версию файла?

 
vaneks   (2002-11-25 21:31) [0]

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


 
TTCustomDelphiMaster   (2002-11-25 21:40) [1]

GetFileVersionInfoSize
GetFileVersionInfo
VerQueryValue


 
vaneks   (2002-11-25 21:47) [2]

Ну это было для краткости написанно версию файла, а вообщето надо всю инфу вытащить которую прописываешь в свойствай проекта>version...


 
TTCustomDelphiMaster   (2002-11-25 21:55) [3]

Вот этими функциями и пользуйтесь.


 
McSimm   (2002-11-26 10:42) [4]

Пример можно посмотреть здесь:
http://delphi.mastak.ru/articles/versioninfo.html


Версия exe файла

 
Broot   (2004-01-14 09:48) [0]

Знатоки, как узнать версию исполняемого файла? Функция GetFileVersionInfo работает с именем файла, а мне доступен лишь дескриптор HWnd главного окна.


 
[lamer]Barmaglot   (2004-01-14 10:09) [1]

ToolHelp?


 
hfa   (2004-01-14 10:13) [2]

моежт это поможет.. Unit ShellAPI

GetModuleFileName()


 
BiN   (2004-01-14 10:22) [3]

2 hfa
скорее GetModuleFileNameEx()


 
AKul   (2004-01-14 10:24) [4]

Если требуется узнать имя запущенной программы, включая полный путь, можно воспользоваться ParamStr(0).


 
Broot   (2004-01-14 10:27) [5]

а не используя имени файла?


 
BiN   (2004-01-14 10:52) [6]

Broot (14.01.04 10:27) [5]
а не используя имени файла?

ты хочешь узнать версию файла, не используя его имя? Это же смешно

Другое дело, если ты хочешь узнать имя файла, зная лишь хэндл одного из его окон.
читай мсдн:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/wind owreference/windowfunctions/getwindowthreadprocessid.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/openprocess.asp

http://msdn.microsoft.com/library/en-us/perfmon/base/getmodulefilenameex.asp


 
Broot   (2004-01-14 10:58) [7]

2 BiN
и почему это смешно? Версия файла хранится в ресурсах и следовательно она доступна напрямую. Другое дело как найти нужный ресурс и расшифровать его.


 
BiN   (2004-01-14 11:07) [8]

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


 
PVOzerski   (2004-01-14 11:08) [9]

2[7]:
А вы думаете, что если программа исполняется, то все ресурсы загружены в оперативную память, находятся в адресном пространстве процесса и могут быть добыты по соответствующему смещению? Увы (а вернее, к счастью, с точки зрения работы с памятью в Windows), это не так.


 
Broot   (2004-01-14 11:33) [10]

2 BiN
Думаю мой код будет эффективнее, потому как он делает тоже самое, но не все, а значительно меньше

2 PVOzerski
и слава богу, что не загружены, а при чем тут это?


 
PVOzerski   (2004-01-14 11:35) [11]

>и слава богу, что не загружены, а при чем тут это?
А при том, что придется всё равно в файле копаться. А открывать его как-то по имени принято.


 
Broot   (2004-01-14 11:42) [12]

2 PVOzerski
а как на счет функций FindResource и LoadResource?


 
BiN   (2004-01-14 11:54) [13]

Broot (14.01.04 11:33) [10]
а ты сначала напиши этот код, а потом поговорим


 
PVOzerski   (2004-01-14 11:58) [14]

>а как на счет функций FindResource и LoadResource?
Ну, изнутри интересующей тебя программы это пройдет. А как добыть хэндл модуля другой программы? А судя по всему, именно другую программу и надо определить.


Мониторинг изменений в директориях и файлах средствами Delphi. Часть #1. – Delphi в Internet

При разработке приложений Delphi для синхронизации чего-либо, например, файлов на разных компьютерах, так или иначе приходится разрабатывать алгоритм с помощью которого можно однозначно определять какие из файлов необходимо удалить из определенной директории, какие переместить, переименовать и т.д. Подобные алгоритмы и примеры их использования на практике не являются редкостью – в Сети Вы можете найти массу самых различных вариаций Delphi-кода с помощью которого можно отследить изменения в директориях и файлах Windows.

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

Самым простым и легкодоступным даже для новичков в программировании способом слежения за изменениями в директории является работа по таймеру. Смысл работы заключается в том, что на старте работы программы создается список файлов и поддиректорий в целевой директории. Затем, в момент срабатывания таймера, создается новый список и сравнивается с предыдущим – определяется какие файлы были добавлены, какие удалены/перемещены и т.д. и по уже определенным изменениям проводятся операции синхронизации.  Как в данном случае определить, что, скажем, файл Test.txt был изменен? Например, можно рассчитывать каждый раз CRC файла и сравнивать эту сумму с предыдущим значением. Вот исходник функции с  www.delphisources.ru, для расчёта CRC файла:

function GetCheckSum(FileName: string): DWORD; var F: file of DWORD; P: Pointer; Fsize: DWORD; Buffer: array[0..500] of DWORD; begin FileMode := 0; AssignFile(F, FileName); Reset(F); Seek(F, FileSize(F) div 2); Fsize := FileSize(F) - 1 - FilePos(F); if Fsize > 500 then Fsize := 500; BlockRead(F, Buffer, Fsize); Close(F); P := @Buffer; asm xor eax, eax xor ecx, ecx mov edi , p @again: add eax, [edi + 4*ecx] inc ecx cmp ecx, fsize jl @again mov @result, eax end; end;

Пример использования функции. Создадим новое приложение в Delphi со следующими компонентами на форме:

При открытии файла будем определять его размер и рассчитывать CRC с помощью приведенной выше функции:

uses IOUtils; [...] procedure TForm3.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin edFile.Text:=OpenDialog1.FileName; lbCRC.Caption:=IntToStr(GetCheckSum(OpenDialog1.FileName)); lbSize.Caption:=IntToStr(TFile.OpenRead(OpenDialog1.FileName).Size); end; end;

Теперь возьмем создадим текстовый файлик и запишем в него строку, скажем “Hello World!”, сохраним его, запустим программу и рассчитаем CRC. Вот, что получилось в программе:

Теперь снова откроем файл и заменим заглавные буквы на прописные, т.е. строка примет вид “hello world!”. Снова рассчитаем CRC:

Обратите внимание, что размер файла остался прежним, а содержимое файла изменилось. Это лишний пример того, что использование в качестве критерия изменения файла только его размера – это очень ненадежный вариант и, наверное, даже неправильный.

Что можно сказать по поводу предложенного выше варианта мониторинга изменения в директории с помощью таймера?

Достоинством этого метода можно назвать его простота. Не важно, какой таймер будет использоваться в работе – стандартный TTimer или собственноручно созданный высокоточный таймер. Повесить обработчик на срабатывание таймера сможет кто угодно. Но наряду с простотой этого варианта он также имеет и массу недостатков. И самый главный из недостатков – ненадежность.

Никто не даст Вам гарантий того, что заданный интервал срабатывания таймера будет достаточным для выполнения процедуры обработчика. Как говориться, компьютер пользователя – потёмки. Можно, конечно, задавать большой интервал времени и надеяться на то, что обработчик таймера отработает на 100%, но это всего-лишь “костыль”, но никак не решение проблем надежности алгоритма.

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

И, поэтому, более рациональным способом мониторинга изменений в файлах и директориях является использование функций Windows. Здесь можно выделить два варианта работы:

  1. Мониторинг изменений в директории без вывода информации об изменениях, т.е. простая констатация факта – было изменение, а что именно было изменено не определяется. Для этого способа используется тройка функций: FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification.
  2. Мониторинг изменений в директории с выводом информации по измененным элементам. Для этого способа используется пара функций: CreateFile и ReadDirectoryChangesW.

Оба этих способа в равной степени удобны, но какой из этих способов использовать в конкретной ситуации решать только Вам. Рассмотрим примеры использования функций Windows для мониторинга изменений в директориях.

Использование функций FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification

Прежде, чем приступим к изучению функций, создадим модуль-заготовку для дальнейшей работы. Следить за изменениями мы будем в потоке (TThread):

unit Monitor;   interface   uses Classes, Windows, SysUtils;   type TChangeMonitor = class(TThread) private public protected procedure Execute; override; end;   implementation   { TChangeMonitor }   procedure TChangeMonitor.Execute; begin {здесь будем проводить мониторинг} end;   end.

Теперь рассмотрим назначение функций Windows.

FindFirstChangeNotification – создает дескриптор уведомления об изменениях и устанавливает начальные условия отправки уведомления. Функция возвращает дескриптор (THandle) либо INVALID_HANDLE_VALUE в случае ошибки:

FindFirstChangeNotification(lpPathName: PChar; bWatchSubtree: boolean; dwNotifyFilter:DWORD): THandle;

lpPathName: PChar – полный путь к директории за которой проводится слежение. Значение этого параметра не может содержать относительный путь или пустую строку.
bWatchSubtree: booleanTrue – указывает на то, что также в результат мониторинга будут попадать изменения в поддиректориях.
dwNotifyFilter:DWORD – набор флагов, определяющих настройки фильтра. Флаги могут быть следующими:

  • FILE_NOTIFY_CHANGE_FILE_NAME (0x00000001) – любое изменение имени файла в каталоге или подкаталоге.  Изменения включают в себя переименование, создание или удаление файла.
  • FILE_NOTIFY_CHANGE_DIR_NAME (0x00000002) – любое изменение имени директории в каталоге или подкаталоге.  Изменения включают в себя переименование, создание или удаление директории.
  • FILE_NOTIFY_CHANGE_ATTRIBUTES (0x00000004) – любое изменение атрибутов в просматриваемой директории и поддиректориях.
  • FILE_NOTIFY_CHANGE_SIZE (0x00000008) – изменение размера файла в директории или поддиректории. Изменение размера обнаруживается только когда файл записывается на диск.
  • FILE_NOTIFY_CHANGE_LAST_WRITE (0x00000010) – изменение времени последней записи в файл.
  • FILE_NOTIFY_CHANGE_SECURITY (0x00000100) – изменение параметров безопасности в каталоге или подкаталоге.

 

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

FindNextChangeNotification(hChangeHandle: THandle):boolean;

hChangeHandle: THandle – дескриптор, полученный с помощью функции FindFirstChangeNotification.

FindCloseChangeNotification – останавливает мониторинг изменений в директории.

FindCloseChangeNotification(hChangeHandle: THandle):boolean;

hChangeHandle: THandle – дескриптор, полученный с помощью функции FindFirstChangeNotification.

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

type TChangeMonitor = class(TThread) private FDirectory: string; FScanSubDirs: boolean; public constructor Create(ASuspended: boolean; ADirectory:string; AScanSubDirs: boolean); protected procedure Execute; override; end;   implementation   { TChangeMonitor }   constructor TChangeMonitor.Create(ASuspended: boolean; ADirectory: string; AScanSubDirs: boolean); begin inherited Create(ASuspended); FDirectory:=ADirectory; FScanSubDirs:=AScanSubDirs; FreeOnTerminate:=true; end;

Теперь создадим следующий Execute:

procedure TChangeMonitor.Execute; var ChangeHandle: THandle; begin {получаем хэндл события} ChangeHandle:=FindFirstChangeNotification(PChar(FDirectory), FScanSubDirs, FILE_NOTIFY_CHANGE_FILE_NAME+ FILE_NOTIFY_CHANGE_DIR_NAME+ FILE_NOTIFY_CHANGE_SIZE ); {Если не удалось получить хэндл - выводим ошибку и прерываем выполнение} Win32Check(ChangeHandle <> INVALID_HANDLE_VALUE); try {выполняем цикл пока} while not Terminated do begin case WaitForSingleObject(ChangeHandle,1000) of WAIT_FAILED: Terminate; {Ошибка, завершаем поток} WAIT_OBJECT_0: {Сообщаем об изменениях}; end; FindNextChangeNotification(ChangeHandle); end; finally FindCloseChangeNotification(ChangeHandle); end; end;

В приведенном выше обработчике Execute мы проводим мониторинг изменения имени файла/директории или размера файла. При этом мы ожидаем любого из заданных в фильтре событий и выводим сообщение. Кстати, создадим событие для вывода сообщения об изменениях, например, такое:

type TChangeMonitor = class(TThread) private [...] FOnChange : TNotifyEvent; procedure DoChange; public [...] property OnChange : TNotifyEvent read FOnChange write FOnChange; protected procedure Execute; override; end;   procedure TChangeMonitor.DoChange; begin if Assigned(FOnChange) then OnChange(Self) end;   procedure TChangeMonitor.Execute; var ChangeHandle: THandle; begin [...] case WaitForSingleObject(ChangeHandle,INFINITE) of WAIT_FAILED: Terminate; //Ошибка, завершаем поток WAIT_OBJECT_0: Synchronize(DoChange); end; [...] end;

Теперь всё готово для проверки работоспособности нашего потока. Создадим новый проект Delphi и на главную форму положим следующие компоненты:

В uses подключим модуль с нашим потоком и объявим следующую переменную:

uses [...], Monitor;   type TForm3 = class(TForm) [...] private FChangeMonitor:TChangeMonitor; public { Public declarations } end;

Теперь напишем необходимые обработчики для событий:

procedure TForm3.Button1Click(Sender: TObject); begin mmLog.Lines.Clear; {создаем поток} FChangeMonitor:=TChangeMonitor.Create(True,edPath.Text,CheckBox1.Checked); {определяем обработчик события} FChangeMonitor.OnChange:=OnChange; {запускаем поток на выполнение} FChangeMonitor.Start; Button1.Enabled:=False; Button2.Enabled:=True; end;   procedure TForm3.Button2Click(Sender: TObject); begin {останавливаем поток} FChangeMonitor.Terminate; Button1.Enabled:=True; Button2.Enabled:=False; end;   procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(FChangeMonitor) then FChangeMonitor.Terminate; end;   procedure TForm3.OnChange(Sender: TObject); const cLogStr = '%s - Изменения в директории'; begin {выводим сообщение в лог} mmLog.Lines.Add(Format(cLogStr,[DateTimeToStr(Now)])) end;

Запускаем программу, выбираем директорию за которой необходимо следить и нажимаем кнопку “Следить”. Теперь попробуем скопировать/удалить какой-нибудь файл и увидим в Memo соответствующее сообщение.
Приведенный выше пример является, наверное, самым простым, когда мы отслеживаем всего лишь одно событие по которому просто констатируем факт – произошли изменения в директории. А какие изменения – об этом мы ничего не сообщаем. Мы даже не можем в этом случае сказать, что именно произошло. Можно слегка подкорректировать приведенный выше обработчик и, используя приведенные выше функции Windows определить различные события на каждый вариант изменений, используя при этом вместо функции WaitForSingleObject функцию WaitForMultipleObjects. Но об этом, а также об использовании методов CreateFile и ReadDirectoryChangesW мы поговорим в следующий раз.

4.3 3 голоса

Рейтинг статьи

Как узнать версию Delphi в которой был создан проект?

 
serrgg   (2006-10-31 14:47) [0]

Есть исходникики чужой программы. В каком файле можно посмотреть версию Delphi?

Спасибо.


 
tesseract ©   (2006-10-31 14:48) [1]

В файле readme.txt.


 
serrgg   (2006-10-31 14:51) [2]

[1] - шутка?


 
Axis_of_Evil ©   (2006-10-31 14:56) [3]

не большая, чем [0]


 
Суслик ©   (2006-10-31 14:58) [4]

*в общем случае* узнать нельзя.
в частных случаях можно узнать косвенно.
например, по наличию тех или иных компонетов и пр.

можно просмотреть в файле *.dof, если таковой есть.

больше не знаю.


 
Vlad433 ©   (2006-10-31 15:09) [5]

Открыть в DeDe 3.5. Там версию сразу покажет.


 
Ketmar ©   (2006-10-31 15:10) [6]

>[5] Vlad433(c) 31-Oct-2006, 15:09
>Открыть в DeDe 3.5. Там версию сразу покажет.
угу. исходник.


 
Alien1769 ©   (2006-10-31 15:12) [7]

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


 
Vlad433 ©   (2006-10-31 15:12) [8]

Sorry, не заметил :)


 
serrgg   (2006-10-31 15:56) [9]


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

Так вопрос в том и состоит чтоб выяснить какой Delphi ставить. Сейчас у меня нет никакого.
Ну никак так никак - поставлю какую попало. Спасибо.

Вообще-то исходники эти - мои. Писал когда учился в университете. В какой версии делал, и вообще какие эти версии бывают - понятия не имею. Давно это было :)


 
Ketmar ©   (2006-10-31 15:59) [10]

не надо "какую попало". ставь лучше рабочую. %-)


 
Alien1769 ©   (2006-10-31 16:25) [11]


> какой Delphi ставить. Сейчас у меня нет никакого

Ту версию, в которой сможешь разобраться, плюс 10 пост.


 
Anatoly Podgoretsky ©   (2006-10-31 17:05) [12]

> serrgg  (31.10.2006 15:56:09)  [9]

> Вообще-то исходники эти - мои.

Тогда какая проблема, используй любую, о проблемах доложит компилятор. За
последнее время у меня несколько проектов мигрировали с Д5 на Д2006 без
единого изменения.


 
ProgRAMmer Dimonych ©   (2006-10-31 19:42) [13]

Если не зашифрована - PE Shiffer из PE Tools и т.п.

Определяют не только версию Дельфи, но и C.


 
Eraser ©   (2006-10-31 19:44) [14]

кстати AFAIK DeDe open source, так что, при желании, можно достать алгоритм оттуда.


 
Desdechado ©   (2006-10-31 20:59) [15]

*.dof, *.cfg - там иногда пути мелькают к home-папке Дельфи
если ставилось по умолчанию, имя папки содержит номер версии


 
Орион ©   (2006-10-31 21:15) [16]

ProgRAMmer Dimonych, Eraser,
там же черным по светло-серому написано, что исходник, а не екзешник))


 
Eraser ©   (2006-10-31 21:21) [17]

> [16] Орион ©   (31.10.06 21:15)

и правда )


 
Ketmar ©   (2006-10-31 21:49) [18]

>[16] Орион(c) 31-Oct-2006, 21:15
>там же черным по светло-серому написано
неправда. белым по синему. %-)


 
Орион ©   (2006-10-31 21:53) [19]

Ketmar, это исключение :))


 
Ketmar ©   (2006-10-31 21:59) [20]

>[19] Орион(c) 31-Oct-2006, 21:53
>Ketmar, это исключение :))
это правило. просто ещё не все прониклись.


 
Орион ©   (2006-10-31 22:02) [21]

Ketmar, вот когда проникнутся - будет правило, а пока - исключение ;)

<offtop>Что у тебя с аськой?</offtop>


 
Ketmar ©   (2006-10-31 22:03) [22]

>[21] Орион(c) 31-Oct-2006, 22:02
><offtop>Что у тебя с аськой?</offtop>
всё ок уже. то, что меня не видно -- вовсе не значит, что меня нет. %-)


 
Орион ©   (2006-10-31 22:05) [23]

Ketmar,
дас ист гут! :)
Я не из дому, аська совсем другая: твоего контакта тут нет :)

Сорри, больше не оффтоплю.


Как узнать версию Delphi в которой был создан проект?

 
serrgg   (2006-10-31 14:47) [0]

Есть исходникики чужой программы. В каком файле можно посмотреть версию Delphi?

Спасибо.


 
tesseract ©   (2006-10-31 14:48) [1]

В файле readme.txt.


 
serrgg   (2006-10-31 14:51) [2]

[1] - шутка?


 
Axis_of_Evil ©   (2006-10-31 14:56) [3]

не большая, чем [0]


 
Суслик ©   (2006-10-31 14:58) [4]

*в общем случае* узнать нельзя.
в частных случаях можно узнать косвенно.
например, по наличию тех или иных компонетов и пр.

можно просмотреть в файле *.dof, если таковой есть.

больше не знаю.


 
Vlad433 ©   (2006-10-31 15:09) [5]

Открыть в DeDe 3.5. Там версию сразу покажет.


 
Ketmar ©   (2006-10-31 15:10) [6]

>[5] Vlad433(c) 31-Oct-2006, 15:09
>Открыть в DeDe 3.5. Там версию сразу покажет.
угу. исходник.


 
Alien1769 ©   (2006-10-31 15:12) [7]

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


 
Vlad433 ©   (2006-10-31 15:12) [8]

Sorry, не заметил :)


 
serrgg   (2006-10-31 15:56) [9]


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

Так вопрос в том и состоит чтоб выяснить какой Delphi ставить. Сейчас у меня нет никакого.
Ну никак так никак - поставлю какую попало. Спасибо.

Вообще-то исходники эти - мои. Писал когда учился в университете. В какой версии делал, и вообще какие эти версии бывают - понятия не имею. Давно это было :)


 
Ketmar ©   (2006-10-31 15:59) [10]

не надо "какую попало". ставь лучше рабочую. %-)


 
Alien1769 ©   (2006-10-31 16:25) [11]


> какой Delphi ставить. Сейчас у меня нет никакого

Ту версию, в которой сможешь разобраться, плюс 10 пост.


 
Anatoly Podgoretsky ©   (2006-10-31 17:05) [12]

> serrgg  (31.10.2006 15:56:09)  [9]

> Вообще-то исходники эти - мои.

Тогда какая проблема, используй любую, о проблемах доложит компилятор. За
последнее время у меня несколько проектов мигрировали с Д5 на Д2006 без
единого изменения.


 
ProgRAMmer Dimonych ©   (2006-10-31 19:42) [13]

Если не зашифрована - PE Shiffer из PE Tools и т.п.

Определяют не только версию Дельфи, но и C.


 
Eraser ©   (2006-10-31 19:44) [14]

кстати AFAIK DeDe open source, так что, при желании, можно достать алгоритм оттуда.


 
Desdechado ©   (2006-10-31 20:59) [15]

*.dof, *.cfg - там иногда пути мелькают к home-папке Дельфи
если ставилось по умолчанию, имя папки содержит номер версии


 
Орион ©   (2006-10-31 21:15) [16]

ProgRAMmer Dimonych, Eraser,
там же черным по светло-серому написано, что исходник, а не екзешник))


 
Eraser ©   (2006-10-31 21:21) [17]

> [16] Орион ©   (31.10.06 21:15)

и правда )


 
Ketmar ©   (2006-10-31 21:49) [18]

>[16] Орион(c) 31-Oct-2006, 21:15
>там же черным по светло-серому написано
неправда. белым по синему. %-)


 
Орион ©   (2006-10-31 21:53) [19]

Ketmar, это исключение :))


 
Ketmar ©   (2006-10-31 21:59) [20]

>[19] Орион(c) 31-Oct-2006, 21:53
>Ketmar, это исключение :))
это правило. просто ещё не все прониклись.


 
Орион ©   (2006-10-31 22:02) [21]

Ketmar, вот когда проникнутся - будет правило, а пока - исключение ;)

<offtop>Что у тебя с аськой?</offtop>


 
Ketmar ©   (2006-10-31 22:03) [22]

>[21] Орион(c) 31-Oct-2006, 22:02
><offtop>Что у тебя с аськой?</offtop>
всё ок уже. то, что меня не видно -- вовсе не значит, что меня нет. %-)


 
Орион ©   (2006-10-31 22:05) [23]

Ketmar,
дас ист гут! :)
Я не из дому, аська совсем другая: твоего контакта тут нет :)

Сорри, больше не оффтоплю.


Как в Delphi определить текущую операционную систему? – Delphi в Internet

При разработке различных приложений в Delphi иногда необходимо определять под какой именно операционной системой запускается наше приложение. Например, чтобы знать – возможно ли использовать в работе приложения центр уведомлений Windows или возможности работы с панелью управления в Delphi.

Версия Delphi XE2 привнесла новые возможности разработки приложений под Mac OS и iOS. Наряду с этим, разработчики в Delphi также получили возможность без использования сторонних компонентов и библиотек определять под какой операционной системой запущено приложение.

Основная информация по компоненту
Исходник официального примера и документация DocWiki

Демонстрационный пример разработан с использованием платформы FMX и показывает как определить версию операционной системы, архитектуру, какие сервис-паки установлены в операционной системе, использую стандартные возможности Delphi, входящие в состав Delphi XE2.

Внешний вид демонстрационного приложения представлен на рисунке ниже:

 

Использование TOSVersion

Запись (record) TOSVersion содержится в модуле System.SysUtils и имеет следующее описание:

Несмотря на то, что TOSVersion появилась в Delphi XE2, код ниже описывает TOSVersion последней версии Delphi 10.3 Rio
type TOSVersion = record public type TArchitecture = (arIntelX86, arIntelX64, arARM32, arARM64); TPlatform = (pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux); public const AllArchitectures = [arIntelX86, arIntelX64, arARM32, arARM64]; AllPlatforms = [pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux]; private class var FArchitecture: TArchitecture; class var FBuild: Integer; class var FMajor: Integer; class var FMinor: Integer; class var FName: string; class var FPlatform: TPlatform; class var FServicePackMajor: Integer; class var FServicePackMinor: Integer; {$IFDEF LINUX} class var FPrettyName: string; class var FLibCVersionMajor: Integer; class var FLibCVersionMinor: Integer; {$ENDIF LINUX} class constructor Create; public class function Check(AMajor: Integer): Boolean; overload; static; inline; class function Check(AMajor, AMinor: Integer): Boolean; overload; static; inline; class function Check(AMajor, AMinor, AServicePackMajor: Integer): Boolean; overload; static; inline; class function ToString: string; static; class property Architecture: TArchitecture read FArchitecture; class property Build: Integer read FBuild; class property Major: Integer read FMajor; class property Minor: Integer read FMinor; class property Name: string read FName; class property Platform: TPlatform read FPlatform; class property ServicePackMajor: Integer read FServicePackMajor; class property ServicePackMinor: Integer read FServicePackMinor; {$IFDEF LINUX} class property PrettyName: string read FPrettyName; class property LibCVersionMajor: Integer read FLibCVersionMajor; class property LibCVersionMinor: Integer read FLibCVersionMinor; {$ENDIF LINUX} end;

TOSVersion имеет следующие свойства:

Свойство Тип Описание
Architecture
TArchitecture = (arIntelX86, arIntelX64, arARM32, arARM64)
Перечисляет архитектуры процессоров, на которых могут работать приложения Delphi
Build Представляет текущий номер сборки операционной системы. Номер сборки обычно указывается как третье число в обозначении версии. Например, в следующей записи: 5.1.2600, номер сборки равен 2600.
Major Представляет основной номер текущей операционной системы. Например, основной номер версии Windows 7 – 6.
Minor Представляет дополнительный номер текущей операционной системы.Чтобы сравнить основные и вспомогательные номера текущей операционной системы с конкретными значениями, используйте функцию проверки (Check).
Name Представляет имя текущей операционной системы.
Platform
TPlatform = (pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux)
Представляет текущую платформу (Windows, Mac OS, Android и т.д.).
ServicePackMajor Представляет основной номер версии пакета обновления для текущей операционной системы.
ServicePackMinor

 

Представляет вспомогательный номер версии пакета обновления для текущей операционной системы.

Также при проверке версии операционной системы в Delphi вы можете использовать следующие метод TOSVersion:

class function Check(AMajor: Integer): Boolean; overload; static; inline; class function Check(AMajor, AMinor: Integer): Boolean; overload; static; inline; class function Check(AMajor, AMinor, AServicePackMajor: Integer): Boolean; overload; static; inline;

Метод определяет является ли версия текущей операционной системы выше или равной определенному значению.

Демонстрационный пример

В примере демонстрируется использование возможностей TOSVersion при определении характеристик операционной системы под которой запущено приложение Delphi.

Вывод информации об операционной системе Windows осуществляется следующим образом:

procedure TFormOSVersion.ButtonGetOSInfoClick(Sender: TObject); begin with MemoLog.Lines do begin Clear; Add(TOSVersion.ToString); Add(''); Add('Architecture: ' + OSArchitectureToStr(TOSVersion.Architecture)); Add('Platform: ' + OSPlatformToStr(TOSVersion.Platform)); Add('Build: ' + IntToStr(TOSVersion.Build)); Add('Major: ' + IntToStr(TOSVersion.Major)); Add('Minor: ' + IntToStr(TOSVersion.Minor)); Add('Name: ' + TOSVersion.Name); Add('Service Pack - Major: ' + IntToStr(TOSVersion.ServicePackMajor)); Add('Service Pack - Minor: ' + IntToStr(TOSVersion.ServicePackMinor)); end; end;

При этом, функции OSArchitectureToStr и OSPlatformToStr определены следующим образом:

Для Delphi 10.3 Rio эти функции необходимо дополнить, так как по сравнению с Delphi XE2, перечень определяемых операционных систем был значительно расширен.

function OSArchitectureToStr(const a: TOSVersion.TArchitecture): string; begin case a of arIntelX86: Result := 'IntelX86'; arIntelX64: Result := 'IntelX64'; else Result := 'UNKNOWN OS architecture'; end; end;   function OSPlatformToStr(const p: TOSVersion.TPlatform): string; begin case p of pfWindows: Result := 'Windows'; pfMacOS: Result := 'MacOS'; else Result := 'UNKNOWN OS Platform'; end; end;

На рисунке ниже представлен пример работающего демонстрационного приложения:

 

При подготовке статьи использовалась информация со следующих ресурсов:

  1. Официальный репозиторий демонстрационных примеров Delphi на SourceForge
  2. Документация по TOSVersion на сайте Embarcadero
Take Our Poll

Как установить "Информация о версии" в Delphi XE7? [Проблема с дизайном Delphi]

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд
.

delphi - изменить номер версии во время сборки

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

delphi - Как узнать путь к файлу, запускаемый при открытии файла с настраиваемым расширением файла?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.Отладка

- Как мне найти все модули в моем приложении Delphi?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Как использовать файлы .Ini в FMX / Delphi

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Как читать из файла ресурсов в delphi 7?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Смотрите также