каталог запуска

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

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

каталог запуска

Сообщение serg_iv » 25.11.2006 21:41:50

Подскажите пожалуйста, как узнать путь к каталогу, из которого запускается программа в Линуксе?
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение Alexander » 25.11.2006 23:02:55

В Линуксе и не только: ParamStr(0)

Дальше, кажется: ExtractFilePath

А ещё в Линуксе иногда делают жёсткую ссылку на экзешник,
и при запуске смотрят: а как экзешник то называется ? И программа
начинает функционировать соответственно названию. Одна и та же.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение serg_iv » 27.11.2006 08:34:21

Спасибо, а то я думал в Линуксе какие-то свои методы. Работает.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение Romtek » 28.11.2006 18:16:21

serg_iv писал(а):Спасибо, а то я думал в Линуксе какие-то свои методы. Работает.

Можно также с помощью pwd
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Сообщение serg_iv » 29.11.2006 14:27:04

Можно также с помощью pwd

Если можете, покажите пожалуйста хоть строчку кода, в качестве примера. Не могу понять, как стыкуется bash с программой на FPC.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение Alexander » 29.11.2006 16:55:37

Romtek писал(а):Можно также с помощью pwd


Действительо как ?

Ведь если верить ману:

pwd - print name of current/working directory


И причём здесь путь к екзешнику ?

Хотя... кажется понял причём - разный взгляд на вопрос.
Я сразу понял, что речь идёт о том, "откуда его запускает система".
А можно было понять и "откуда его запускает пользователь" !

Но после положительного разрешения вопроса с помощью ParamStr ???
Снова непонятно.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Romtek » 29.11.2006 17:40:23

Alexander писал(а):
Romtek писал(а):Можно также с помощью pwd


Действительо как ?

Ведь если верить ману:

pwd - print name of current/working directory


И причём здесь путь к екзешнику ?

Твой вариант нужен для того, чтобы узнать полный путь к собственной программе.
А если нужно узнать из какой директории её вызывают, то используется мой вариант. Или как сказано в http://community.freepascal.org:10000/docs-html/rtl/baseunix/fpgetcwd.html

P.S. В Линуксе нет "екзешников".
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Сообщение shade » 29.11.2006 21:01:51

Не знаю как в Linux, а в Windows ParamStr(0) может возвращать неожиданный результат, если точнее, то он вернет, то что будет передано функции CreateProcess.
Я как-то забыл указать путь к файлу параметре комадной строки - прога запускалась нормально, но вот ParamStr(0) возвращал что-то не то...

Под WinAPI правлильное решение GetModuleFileName(0, ...), возможно под Linux, есть что-то подобное... спецы подскажут..
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Romtek » 30.11.2006 01:21:38

shade, но речь не о винде...
Аватара пользователя
Romtek
постоялец
 
Сообщения: 190
Зарегистрирован: 22.05.2005 12:29:35
Откуда: Рамат Ган

Сообщение Alexander » 30.11.2006 02:59:02

Romtek писал(а):А если нужно узнать из какой директории её вызывают, то используется мой вариант.


Ну вот теперь мы знаем оба варианта. И это плюс. Кажется
освоение Линукса пошло в гору.

Romtek писал(а):P.S. В Линуксе нет "екзешников".


Есть, но только в профиль :) Хотя в кавычки взять следовало.

The Executable and Linking Format (ELF)


shade писал(а):Не знаю как в Linux, а в Windows ParamStr(0) может возвращать неожиданный результат,


Да, в том числе и по этому я её покинул. Кажется ещё выдаёт
в то ли в оем то ли в анси (что было неудобно).
И поэтому я тоже использовал GetModuleFileName.
Хотя ParamStr(0) "официально" для этой задачи предназначена.
Это не трюк. А Вин - баг, там все результаты неожиданные.
В ДОСе работала "на ура" и в Линуксе работает.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: каталог запуска

Сообщение Сквозняк » 02.06.2023 12:06:04

Alexander писал(а):И поэтому я тоже использовал GetModuleFileName.
Хотя ParamStr(0) "официально" для этой задачи предназначена.

В винде они тоже ущербные, из-за кодировок.
Код: Выделить всё
$if defined(win32) or defined(win64) or defined(wince)}
function GetModuleName(Module: HMODULE): string;
var
  ResultLength, BufferLength: DWORD;
  Buffer: UnicodeString;
begin
  BufferLength := MAX_PATH div 2;
  repeat
    Inc(BufferLength, BufferLength);
    SetLength(Buffer, BufferLength);
    ResultLength := GetModuleFileNameW(Module, Pointer(Buffer), BufferLength);
    if ResultLength = 0 then
      Exit('');
  until ResultLength < BufferLength;
  SetLength(Buffer, ResultLength);
  Result := Buffer;
end;

То есть высчитывается строка в UnicodeString а потом перекодируется и при этом могут повредиться данные, записанные кракозябрами. Лучше всего форкнуть эту функцию. Но как лучше прописать зависимости для GetModuleFileNameW?
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: каталог запуска

Сообщение delphius » 02.06.2023 14:12:20

Так а почему не просто...?
Код: Выделить всё
function GetModuleName(Module: HMODULE): UnicodeString;
var
  Buffer: array [0..MAX_PATH] of WideChar;
begin
  if GetModuleFileNameW(Module, Buffer, Length(Buffer)) > 0 then
    Result := Buffer
  else
    Result := '';
end;
delphius
постоялец
 
Сообщения: 129
Зарегистрирован: 18.03.2020 13:40:11

Re: каталог запуска

Сообщение Sharfik » 02.06.2023 17:30:11

Сквозняк писал(а):В винде они тоже ущербные, из-за кодировок.

Функции все адекватные. Если программист не понимает что делает, и устраивает котовасию как выше это его косяк, а не винды. Винда работает со своей кодировкой, и возвращает строки в WideString/UTF-16. Это как пытаться ехать на паровозе с колесной парой 800мм, по путям 1000мм. Естественно на стыке систем надо сделать перекодирование. Давайте еще позмущаться, почему исходники С++ не читаются FPC копилятором без переделки.
shade писал(а):Не знаю как в Linux, а в Windows ParamStr(0) может возвращать неожиданный результат, если точнее, то он вернет, то что будет передано функции CreateProcess.

Еще одна глупость... ParamStr(0) возвращает все что надо. А поведение программы зависит от указанного ей домашнего каталога при запуске. Его просто надо сбросить на значение ParamStr(0) при старте ПО.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: каталог запуска

Сообщение Сквозняк » 02.06.2023 19:12:28

Sharfik писал(а):Функции все адекватные. Если программист не понимает что делает, и устраивает котовасию как выше это его косяк, а не винды. Винда работает со своей кодировкой, и возвращает строки в WideString/UTF-16. Это как пытаться ехать на паровозе с колесной парой 800мм, по путям 1000мм. Естественно на стыке систем надо сделать перекодирование. Давайте еще позмущаться, почему исходники С++ не читаются FPC копилятором без переделки.


В каком месте они адекватные? Написано, что путь каталога будет возвращён в string;, то есть в однобайтной строке, так и возвращайте все байты, чтобы с ними можно было работать. Так нет же, GetModuleName херит часть данных. Перекодирование в string; можно делать по разному: с потерей данных и без него. Функция херит, а это есть неадекватно. Задавал вопрос чтобы по быстрому узнать, что писать в
Код: Выделить всё
uses
..........

Потому что в справке https://www.freepascal.org/daily/packages/winunits-jedi/jwawinbase/getmodulefilenamew.html указан не конкретный модуль и конечно ожидал, что вместо ответа будет срач от кого-то из любителей тупых официальных решений, которые любую официальную глупость мешающую использовать fpc будут впаривать. Но всё-таки допускал мизерный шанс что получу от сообщества название модуля без длительного брутфорса. Но этот шанс не состоялся, тот кто это знает, тот не скажет из-за вышеупомянутых идеологических причин и всё равно придётся брутфорсить и тратить время на эту лажу вместо написания другого кода.

Sharfik писал(а):Еще одна глупость... ParamStr(0) возвращает все что надо.


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

Добавлено спустя 50 минут 59 секунд:
Набрутфорсил, ибо утро вечера мудренее :mrgreen: , насколько данные не бьются, пока не проверял, возможно ещё патчить придётся.
Код: Выделить всё
uses
JwaWindows;

type
stroki2 = type ANSISTRING(65001);

var
s5: stroki2;

function GetModuleName2(Module: HMODULE): UnicodeString;
var
{
ResultLength, BufferLength: DWORD;
Buffer: UnicodeString;
begin
BufferLength := MAX_PATH div 2;
repeat
Inc(BufferLength, BufferLength);
SetLength(Buffer, BufferLength);
ResultLength := GetModuleFileNameW(Module, Pointer(Buffer), BufferLength);
if ResultLength = 0 then Exit('');
until ResultLength < BufferLength;
SetLength(Buffer, ResultLength);
GetModuleName2:=Buffer;
}
Buffer: array [0..MAX_PATH] of WideChar;
begin
if GetModuleFileNameW(Module, Buffer, Length(Buffer)) > 0 then GetModuleName2 := Buffer
  else GetModuleName2 := '';
end;

begin
s5:=GetModuleName2(0);
writeln('_1____Scitannyi putj= ',GetModuleName2(0));
writeln('_2____Scitannyi putj= ',s5);
end.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: каталог запуска

Сообщение Sharfik » 04.06.2023 17:50:43

Сквозняк писал(а):Если бы эта функция в винде всегда возвращала что надо, то и вопроса тут не задавал. Давайте и все баги на багтрекере тоже глупостью обзывать - кто-то посмел назвать результат официальных решений багами. Всем запостившим баги на багтрекере вместо решения выдать по подзатыльнику и баги исчезнут а программы перестанут глючить!

Программа это четкая структура, она не делает что то просто так. Если возврат не соответствует ожиданию, значит условия не соответствуют заданным программистом. Либо программист не учет работу системы безопасности ОС, либо запуск программы был не так как предусматривал программист. И т.п. Функция тут не причем. Если я лох и не читаю доку по политикам Windows, то это мои проблемы. У меня так же не работало ПО, потому что его запускали не через ярлык, а через связанный файл. Но я не кричу что функция косячная. Нашел, дополнил условия такого запуска.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 7

Рейтинг@Mail.ru