• 0
giveaway

Как обратится к бинарнику внутри контейнера .app или вытащить его оттуда?

Вопросы

Приложение под Мак должно распаковывать .rar-архивы. Делаю это бинаркником unar (не путать с unrar от RarLab). На данный момент через Deployment поместил его в контейнер .app

Но дальше мне его надо, или вынуть оттуда и куда-то положить (потом позднее обратиться к нему, зная, куда он лег), или прямо запускать его по командой строке внутри контейнера (если такое возможно).

Буду признателен за помощь в данном вопросе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 ответов на этот вопрос

  • 0
22 минуты назад, giveaway сказал:

Приложение под Мак должно распаковывать .rar-архивы. Делаю это бинаркником unar (не путать с unrar от RarLab). На данный момент через Deployment поместил его в контейнер .app

Но дальше мне его надо, или вынуть оттуда и куда-то положить (потом позднее обратиться к нему, зная, куда он лег), или прямо запускать его по командой строке внутри контейнера (если такое возможно).

Буду признателен за помощь в данном вопросе.

Я почему не пользуешься из коробки zip'ом? Если чесно, не совсем понял суть вопроса. Программа в маке - это обычная директория с расширением .app. Поэтому если ты с архивом будешь работать из этой же программы, то в эту же директорию и складывай. Я так делаю))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
22 минуты назад, Vitaldj сказал:

Я почему не пользуешься из коробки zip'ом?

Нужна возможность работы с мультитомными архивами.

 

22 минуты назад, Vitaldj сказал:

Программа в маке - это обычная директория с расширением .app. Поэтому если ты с архивом будешь работать из этой же программы, то в эту же директорию и складывай. Я так делаю))

Ок, попробую тогда обратиться по пути MyApp.app\Contents\MacOS\unar

А чем MyApp может выяснить свое месторасположение? Для Мака это как делается?

 

Изменено пользователем giveaway

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
33 минуты назад, giveaway сказал:

А чем MyApp может выяснить свое месторасположение? Для Мака это как делается?

 

Та как обычно: ExtractFilePath(ParamStr(0))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
10 часов назад, giveaway сказал:

ExtractFilePath(ParamStr(0)) почему-то возвращает пустую строку. В чем может быть загвоздка?

А покажите часть кода, что вы используете эту функцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
18 часов назад, Vitaldj сказал:

Та как обычно: ExtractFilePath(ParamStr(0))

Лучше использовать System.IOUtils.TPath.GetLibraryPath

19 часов назад, giveaway сказал:

Нужна возможность работы с мультитомными архивами

Встроенный Zip тоже может разбивать по томам. Например команда "zip -r -s 50 ArchiveName.zip FolderName/" упакует всю папку "FolderName" и разобьёт архив по файлам весом 50Mb

Изменено пользователем dnekrasov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
7 часов назад, Vitaldj сказал:

А покажите часть кода, что вы используете эту функцию.

ExeDir=ExtractFilePath(ParamStr(0));// папка приложения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, giveaway сказал:

ExeDir=ExtractFilePath(ParamStr(0));// папка приложения

А тип exeDir ? Не знаю, у мнея все ок))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

тип ExeDir AnsiString. Под Виндой эта фнукция мне возвращает нормальный путь, а для Мака - возвращает пустую строку. Почему?

Изменено пользователем giveaway

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 часов назад, dnekrasov сказал:

Лучше использовать System.IOUtils.TPath.GetLibraryPath

Данная функция определяет только юзерскую папку Library, а мое .app лежит совершенно в другом месте. Как составить в этом случае запрос с помощью TPath?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
24 минуты назад, giveaway сказал:

Как составить в этом случае запрос

Вот код, который вернёт путь к исполняемому файлу (тот, который деплоится в "Contents\MacOS\")

function GetModuleFName(AModule: Cardinal): string;
begin
  SetLength(Result, MAX_PATH);
  GetModuleFileName(AModule, @Result[1], MAX_PATH);
  SetLength(Result, StrLen(PChar(Result)));
end;

function GetModuleFolder: string;
begin
  Result := IncludeTrailingPathDelimiter(ExtractFilePath(GetModuleFolder(HInstance)));
end;

:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, dnekrasov сказал:

GetModuleFileName

Цитата

Warning: GetModuleFileName is not always successful. Depending on the way the application is called, the presence of the /proc file system, and other factors, there are times when GetModuleFileName may return a name that is not fully qualified or, in some cases, no file name at all. Be sure to check the results of this function before using the returned value.

 

Похоже, это как раз случай автора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Я понятия не имею, что уж у вас там не получается, вот результат вот этой функции:

procedure TForm2.Button1Click(Sender: TObject);
begin
showmessage(ExtractFilePath(ParamStr(0)));
end;

58fd66418fb0a_Screenshotat.2407-42-49.thumb.png.d1cbfaf3ed2fff45c065778a3e76face.png

Так, что что то у вас не то))

 

Изменено пользователем Vitaldj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
21 час назад, dnekrasov сказал:

Result := IncludeTrailingPathDelimiter(ExtractFilePath(GetModuleFolder(HInstance)));

А как и где определяется HInstance?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 часа назад, Vitaldj сказал:

Я понятия не имею, что уж у вас там не получается, вот результат вот этой функции:


procedure TForm2.Button1Click(Sender: TObject);
begin
showmessage(ExtractFilePath(ParamStr(0)));
end;

Неа, не получается. Vitaldj, какой у вас сетап? Билдер, версия Mac OS?

Набрел вот на топик: http://codeverge.com/embarcadero.delphi.firemonkey/paramstr-1/1044953

Автор спрашивает

Цитата

Opening a file in the Windows Explorer with my Firemonkey app works, but in the Finder of Mac OS it does not work. I use Paramstr(1). How can I read the filepath and filename in Mac OS X ?

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

Цитата

OS X does not pass file names to GUI applications via the command line like Windows does. You need to (a) specify in the plist file (roughly equivalent to a manifest on Windows) what file types you application can open and (b) implement a custom delegate for NSApplication.

 

Изменено пользователем giveaway

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
7 минут назад, giveaway сказал:

Неа, не получается. Vitaldj, какой у вас сетап? Билдер, версия Mac OS?

У меня дельфи. Все это барахло работало всегда. Начинас с delphi xe4 и сейчас Tokio. Мак, тоже весь. Сейчас последний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 минуту назад, giveaway сказал:

На виртуальном, только у меня С, а не Delphi

Я затра компильну для тебя, то приложение, от которого скрин вверху. А ты запустишь его. И посмотрим, что покажет showmessage. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, giveaway сказал:

А как и где определяется HInstance?

Это глобальная переменная, которая объявлена в SysInit:

HInstance: HINST;             { Handle of this instance }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот, скомпилировал одну процедуру: 

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(ExtractFilePath(ParamStr(0)));
end;

Проверьте

Project1.app.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

У меня тоже все работает. Но это вероятно из-за того, что приложение было написано на Делфи. Встречал в сети такую инфу, что не работает именно в Си.

В общем, мне удалось получит путь приложения нижеследующим кодом:

ExeDir=ExtractFilePath(GetModuleName(HInstance));// папка приложения
NameFile_unrar_dll=ExeDir+"unar";
buffer=NameFile_unrar_dll+" "+NameSaveFileAll[i]+" -D -o "+DirSaveFile;
retrn=system(buffer.c_str());

т.е. я пытаюсь обратиться с командной строкой на распаковку к бинарнику unar, который лежит внутри контейнера .app, но в итоге получаю такой alert (см. картинку). Терминал же ругается, что no such file or directory. Хотя путь в предупреждении прописан верный

 

Безымянный.jpg

Изменено пользователем giveaway

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 часа назад, giveaway сказал:

т.е. я пытаюсь обратиться с командной строкой на распаковку к бинарнику unar, который лежит внутри контейнера .app, но в итоге получаю такой alert (см. картинку). Терминал же ругается, что no such file or directory. Хотя путь в предупреждении прописан верный

А что это за бинарничек, к которому вы хотите обратиться внутри программы? Он для мака?  И кто вам сказал, что так будет работать? Да, программа - это директория, но в концепции мака - это приложение. И насколько я понимаю (да и экспериментировал), из своей же программы, внутри себя в директории нельзя запустить стороннее приложение. Именно поэтому я и пользуюсь из коробки zip. Я об этом писал в первом своем посте. Если вы хотите все таки запустить стороннее приложение, то его надо ложить не во внутрь, а в другую директорию. Для этого в маке есть тоже директория documents, там создайте еще свою директорию и положите туда этот бинарник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Vitaldj сказал:

Он для мака?  И кто вам сказал, что так будет работать?

Да, для мака. Скачал с сайта разработчика. Если руками этому бинарнику дать командую строку с ключами - он все распаковывает. Более того, если я к проекте прописывают путь к какой-то папке, где лежит unar, то моя аппликуха тоже его запускает и он работает.

Ок. Пусть он не запускается внутри контейнера. Меня устроит вариант, что я из контейнера предварительно закину этот unar в какую-то папку (по завершении оттуда удалю). Вопрос - как скопировать бинарник из контейнера куда-то по указанному пути? Мак это разрешает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу