определение каталога бинарника

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

определение каталога бинарника

Сообщение sunjob »

добрый день

как определить полный путь, где лежит бинарник? (не каталог запуска)

GetCurrentDir() - указывает каталог (*) из которого запущен бинарник (что, естественно, не то)

запускать бинарник можно из любого удобного места :о) и GetCurrentDir() - выдает именно этот каталог, но не тот, где лежит бинарник (как-то так)

п.с. набегом, что-то не нашел :о), что-то не торкнуло еще, может не втуда думаю?
спасибо
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

ExtractFilePath(Application.ExeName)
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

в обычном паскале

Код: Выделить всё

CWD := ExtractFilePath(ParamStr(0));


спасибо
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Самый универсальный способ:

Код: Выделить всё

AppDir:=IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0)));
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

да, вроде, как "оно" там и так буде на месте, по другому никакъ... разве не? :о)
лишний раз дергать зачем?!
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Application.ExeName рекомендуется использовать с осторожностью, а ParamStr(0) - не использовать вообще или с большей осторожностью, особенно, если проект потенциально мультиплатформенный
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

хорошо, не будем использовать осторожные и потенциально опасные варианты :о)
какие есть правильные методы? :о)

p.s. если нет альтернативы, то значит нет и других путей :о), понятное дело надо разбираться в тонкостях и помнить обо всех этих особенностях. в данном случае выбра нет, сделал ссылку - сам себе товаришь мойор, товарищь деревянкин :о)

спасибо
Последний раз редактировалось sunjob 01.07.2020 21:56:24, всего редактировалось 1 раз.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Что насчёт fileutil.ProgramDirectory?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

sunjob писал(а):хорошо, не будем испозовать осторожные и потенциально опасные варианты :о)


Там основная прелесть то не в том, что будут неправильно работать функции RTL freepascal, а в том, что исполняющая система ОС может в принципе не давать определить, в каком каталоге находится запущенный файл.
Будет подкладывать, например, "/" - и всё.
Насколько помню, стоит программу запустить как cgi через апач на линуксе - и там не только каталог запуска не определишь, а вообще всё летит к чертям собачим, включая текущую локаль, временной пояс и все переменные окружения.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

SSerge писал(а):как cgi через апач на линуксе - и там не только каталог запуска не определишь, а вообще всё летит к

Запускал. Как раз мой вариант, приведенный выше отрабатывал правильно. А также fastcgi, и сервер. Windows естественно также. MacOS не проверял
Аватара пользователя
sunjob
постоялец
Сообщения: 176
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

ProgramDirectory() - это Lazarus функция, я тут использую fpc-3.0.4...(но, по идее, то, что надо)
Ответить