Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


giveaway

Вопрос

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

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

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 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
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

тип 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
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

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

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

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 в какую-то папку (по завершении оттуда удалю). Вопрос - как скопировать бинарник из контейнера куда-то по указанному пути? Мак это разрешает?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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