Запуск приложения с использованием «launchTaskWithLaunchPath» API Какао / target-c - PullRequest
3 голосов
/ 25 июля 2010

Мне нужно запустить TextMate из приложения, и я использовал следующий код.

[NSTask launchedTaskWithLaunchPath:@"/Applications/TextMate.app" arguments:[NSArray arrayWithObjects:@"hello.txt", nil]];

Но я получил следующую ошибку:

*** NSTask: Task create for path '/Applications/TextMate.app' failed: 22, "Invalid argument".  Terminating temporary process.
  • Что не так с моим кодом?Я просто попытался запустить "TextMate hello.txt".

ДОБАВЛЕНО

Я мог бы сделать так, как он работает.* другой вопрос , чтобы узнать, сколько других доступных способов.

Ответы [ 3 ]

7 голосов
/ 25 июля 2010

В этом случае недопустимым параметром является имя приложения.

Если вы проверите документацию по NSTask, вы увидите, что используемый вами метод в основном является оболочкой для низкоуровневого exec (Системный вызов.Это означает, что вам нужно предоставить имя фактического исполняемого или двоичного файла, чтобы он мог создавать процесс.В вашем случае вы даете ему каталог (используйте терминал, чтобы подтвердить, что большинство пакетов приложений в / Applications являются каталогами).Вот почему это barfs.

Вы можете заглянуть в каталог комплектов TextMate, чтобы найти фактический исполняемый файл (должен быть где-то в /Applications/TextMate.app/Contents/MacOS).Затем вы можете изменить свой код так, чтобы он вызывал фактический исполняемый файл.

Однако может показаться, что правильный способ сделать это с помощью Cocoa - использование NSWorkspace, вы можете взглянуть на его openFile: withApplication: метод,который, кажется, делает то, что вам нужно, и в этом случае вы действительно указываете каталог пакета приложения в качестве параметра, как вы это делали изначально.

Официальная документация здесь .

Кстати, я не могу полностью взять на себя ответственность за это;см. этот ответ StackOverflow , чтобы узнать больше об этой теме.

4 голосов
/ 25 июля 2010

Вы пытаетесь запустить каталог, а не бинарный файл.

1 голос
/ 22 февраля 2012

С появлением песочницы это больше не работает и завершается неудачно с "idden-sandbox-reinit ", если вы пытаетесь запустить себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...