каталог запуска
Модератор: Модераторы
каталог запуска
Подскажите пожалуйста, как узнать путь к каталогу, из которого запускается программа в Линуксе?
- Alexander
- энтузиаст
- Сообщения: 880
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
Romtek писал(а):Можно также с помощью pwd
Действительо как ?
Ведь если верить ману:
pwd - print name of current/working directory
И причём здесь путь к екзешнику ?
Хотя... кажется понял причём - разный взгляд на вопрос.
Я сразу понял, что речь идёт о том, "откуда его запускает система".
А можно было понять и "откуда его запускает пользователь" !
Но после положительного разрешения вопроса с помощью ParamStr ???
Снова непонятно.
- Romtek
- постоялец
- Сообщения: 190
- Зарегистрирован: 22.05.2005 12:29:35
- Откуда: Рамат Ган
- Контактная информация:
Alexander писал(а):Romtek писал(а):Можно также с помощью pwd
Действительо как ?
Ведь если верить ману:pwd - print name of current/working directory
И причём здесь путь к екзешнику ?
Твой вариант нужен для того, чтобы узнать полный путь к собственной программе.
А если нужно узнать из какой директории её вызывают, то используется мой вариант. Или как сказано в http://community.freepascal.org:10000/docs-html/rtl/baseunix/fpgetcwd.html
P.S. В Линуксе нет "екзешников".
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Не знаю как в Linux, а в Windows ParamStr(0) может возвращать неожиданный результат, если точнее, то он вернет, то что будет передано функции CreateProcess.
Я как-то забыл указать путь к файлу параметре комадной строки - прога запускалась нормально, но вот ParamStr(0) возвращал что-то не то...
Под WinAPI правлильное решение GetModuleFileName(0, ...), возможно под Linux, есть что-то подобное... спецы подскажут..
Я как-то забыл указать путь к файлу параметре комадной строки - прога запускалась нормально, но вот ParamStr(0) возвращал что-то не то...
Под WinAPI правлильное решение GetModuleFileName(0, ...), возможно под Linux, есть что-то подобное... спецы подскажут..
- Alexander
- энтузиаст
- Сообщения: 880
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
Romtek писал(а):А если нужно узнать из какой директории её вызывают, то используется мой вариант.
Ну вот теперь мы знаем оба варианта. И это плюс. Кажется
освоение Линукса пошло в гору.
Romtek писал(а):P.S. В Линуксе нет "екзешников".
Есть, но только в профиль
The Executable and Linking Format (ELF)
shade писал(а):Не знаю как в Linux, а в Windows ParamStr(0) может возвращать неожиданный результат,
Да, в том числе и по этому я её покинул. Кажется ещё выдаёт
в то ли в оем то ли в анси (что было неудобно).
И поэтому я тоже использовал GetModuleFileName.
Хотя ParamStr(0) "официально" для этой задачи предназначена.
Это не трюк. А Вин - баг, там все результаты неожиданные.
В ДОСе работала "на ура" и в Линуксе работает.
В винде они тоже ущербные, из-за кодировок.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;Так а почему не просто...?
Код: Выделить всё
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;Функции все адекватные. Если программист не понимает что делает, и устраивает котовасию как выше это его косяк, а не винды. Винда работает со своей кодировкой, и возвращает строки в WideString/UTF-16. Это как пытаться ехать на паровозе с колесной парой 800мм, по путям 1000мм. Естественно на стыке систем надо сделать перекодирование. Давайте еще позмущаться, почему исходники С++ не читаются FPC копилятором без переделки.Сквозняк писал(а):В винде они тоже ущербные, из-за кодировок.
Еще одна глупость... ParamStr(0) возвращает все что надо. А поведение программы зависит от указанного ей домашнего каталога при запуске. Его просто надо сбросить на значение ParamStr(0) при старте ПО.shade писал(а):Не знаю как в Linux, а в Windows ParamStr(0) может возвращать неожиданный результат, если точнее, то он вернет, то что будет передано функции CreateProcess.
В каком месте они адекватные? Написано, что путь каталога будет возвращён в string;, то есть в однобайтной строке, так и возвращайте все байты, чтобы с ними можно было работать. Так нет же, GetModuleName херит часть данных. Перекодирование в string; можно делать по разному: с потерей данных и без него. Функция херит, а это есть неадекватно. Задавал вопрос чтобы по быстрому узнать, что писать вSharfik писал(а):Функции все адекватные. Если программист не понимает что делает, и устраивает котовасию как выше это его косяк, а не винды. Винда работает со своей кодировкой, и возвращает строки в WideString/UTF-16. Это как пытаться ехать на паровозе с колесной парой 800мм, по путям 1000мм. Естественно на стыке систем надо сделать перекодирование. Давайте еще позмущаться, почему исходники С++ не читаются FPC копилятором без переделки.
Код: Выделить всё
uses
..........
Если бы эта функция в винде всегда возвращала что надо, то и вопроса тут не задавал. Давайте и все баги на багтрекере тоже глупостью обзывать - кто-то посмел назвать результат официальных решений багами. Всем запостившим баги на багтрекере вместо решения выдать по подзатыльнику и баги исчезнут а программы перестанут глючить!Sharfik писал(а):Еще одна глупость... ParamStr(0) возвращает все что надо.
Добавлено спустя 50 минут 59 секунд:
Набрутфорсил, ибо утро вечера мудренее
Код: Выделить всё
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.
Программа это четкая структура, она не делает что то просто так. Если возврат не соответствует ожиданию, значит условия не соответствуют заданным программистом. Либо программист не учет работу системы безопасности ОС, либо запуск программы был не так как предусматривал программист. И т.п. Функция тут не причем. Если я лох и не читаю доку по политикам Windows, то это мои проблемы. У меня так же не работало ПО, потому что его запускали не через ярлык, а через связанный файл. Но я не кричу что функция косячная. Нашел, дополнил условия такого запуска.Сквозняк писал(а):Если бы эта функция в винде всегда возвращала что надо, то и вопроса тут не задавал. Давайте и все баги на багтрекере тоже глупостью обзывать - кто-то посмел назвать результат официальных решений багами. Всем запостившим баги на багтрекере вместо решения выдать по подзатыльнику и баги исчезнут а программы перестанут глючить!
