2012-05-21 3 views
1

В моем приложении для какао я должен вызвать функцию system() для запуска внешнего приложения. Команда, которую я использую:system() call in cocoa app

system("./main &"); 

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

Если я создаю архив и распространяю мое приложение .app, system() не может найти «главное». Где я должен это выразить? Или иначе, как я могу запустить приложение, используя «./», когда меня нет в папке, в которой находится приложение?

EDIT: Может быть, я решил использовать NSTask, но как я могу запустить «main» в фоновом режиме? Теперь он открывается в новом окне терминала.

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath:@"/Applications/Multibo/main"]; 
[task setArguments:[NSArray arrayWithObjects:[NSString stringWithFormat:@"./main &"], nil]]; 
[task launch]; 

Благодаря

+1

Обратите внимание, что вы не можете делать какие-либо предположения о рабочем каталоге во время выполнения, поэтому вам нужен полный путь. –

ответ

1

Попробуйте добавить полный путь перед именем исполняемого и использовать его в качестве аргумента system. Обратите внимание, что system определяется реализацией - его поведение не гарантируется одинаковым для всех систем, поэтому его использование не рекомендуется. Вероятно, вам стоит найти подходящую альтернативу, такую ​​как NSWorkspace.

1

Хотя ответ dirkgently является правильным, реальный ответ более сложный.

Во-первых, NSTask не является общим вызовом командной строки. Вот почему добавление & не делает то, что вы ожидаете. Фактически, все задачи, вызванные с помощью NSTask, фактически являются фоном.

Но вы действительно не хотите использовать NSTask. Вы действительно должны использовать службу XPC. Теперь, если ваша цель - это то, что выполняется даже после выхода вашей программы, вы должны искать в LaunchServices.