2015-02-11 3 views
-1

Я делаю простую пусковую установку для двоичного кода, чтобы я мог появиться на моей стартовой панели.Как запустить двоичный файл из приложения Cocoa?

Моя первоначальная мысль заключалась в том, что для выполнения операции system("./myProgram"); было бы достаточно, но на самом деле она ничего не делает, поскольку экземпляр терминала, который он запускает, не остается открытым после запуска команды, немедленно закрывая любые другие задачи, которые программа выполняла ,

Итак, мой вопрос в том, есть ли способ для меня сделать это, чтобы держать его открытым на неопределенный срок?

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

Edit: следующим всю работу, но только при запуске от Xcode, при работе его автономно не запускать программу на всех

system("open /Applications/Utilities/Terminal.app myProgram"); 
system("open myProgram"); 
system("/bin/sh -c ./myProgram&"); 
system("./myProgram&"); 

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath: @"/bin/bash"]; 
[task setArguments: @[@"-c", @"./myProgram"]]; 
[task launch]; 

NSTask не дает каких-либо ошибок, и он не выбрасывает никаких исключений, либо когда приложение работает

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

Основываясь на всей «обратной связи», вот что я получил до сих пор. И он по-прежнему не работает, если я не обеспечивают абсолютный путь (который не хорошо в случае, если я хочу, чтобы переместить его позже)

// 
// AppDelegate.m 
// DFLauncher 
// 
// Created by Electric Coffee on 11/02/15. 
// Copyright (c) 2015 Electric Coffee. All rights reserved. 
// 

#import "AppDelegate.h" 

@interface AppDelegate() 

@property (weak) IBOutlet NSWindow *window; 
@end 

NSString *CURRENT_DIR; 
NSString *FILE_PATH; 
NSString *INIT_PATH = @"/data/init/init.txt"; 
NSString *VOLUME_ON = @"[SOUND:YES]"; 
NSString *VOLUME_OFF = @"[SOUND:NO]"; 

BOOL contains(NSString *a, NSString *b) { 
    return [a rangeOfString: b].location != NSNotFound; 
} 

NSData *replaceString(NSString *fileContents, NSString *from, NSString *to) { 
    return [[fileContents stringByReplacingOccurrencesOfString: from withString: to] 
      dataUsingEncoding: NSUTF8StringEncoding]; 
} 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching: (NSNotification *)aNotification { 
    CURRENT_DIR = [[NSFileManager new] currentDirectoryPath]; //[[NSBundle mainBundle] bundlePath]; 
    //NSLog(@"%@", CURRENT_DIR); 

    FILE_PATH = [CURRENT_DIR stringByAppendingString: INIT_PATH]; 
    _fileContents = [NSString stringWithContentsOfFile: FILE_PATH 
               encoding: NSUTF8StringEncoding 
               error: NULL]; 
    if (contains(_fileContents, VOLUME_OFF)) 
     [_toggleMute setState: YES]; 
    if (contains(_fileContents, VOLUME_ON)) 
     [_toggleMute setState: NO]; 
} 

- (void)applicationWillTerminate:(NSNotification *)aNotification { 

} 

- (IBAction)playButtonClick: (id)sender { 
    //system("open /Applications/Utilities/Terminal.app df"); // doesn't quite work 
    //system("open /Applications/df_osx/df"); 
    //system("/bin/sh -c /Applications/df_osx/df&"); 
    //system("/Applications/df_osx/df&"); 

    NSString *gamePath = [CURRENT_DIR stringByAppendingString: @"/df&"]; 

    NSTask *task = [NSTask new]; 
    [task setLaunchPath: @"/bin/bash"]; 
    [task setArguments: @[@"-c", gamePath]]; 
    NSError *error = task.standardError; 
    [task launch]; 

    [NSAlert alertWithError: error]; 

    //[NSApp terminate: self]; 
} 

- (IBAction)folderButtonClick: (id)sender { 
    system("open ."); 
} 

- (IBAction)quitButtonClick: (id)sender { 
    [NSApp terminate: self]; 
} 

- (IBAction)mute: (id)sender { 
    NSData *result; 
    NSFileManager *fm = [NSFileManager defaultManager]; 
    if ([sender state] == NSOffState) 
     result = replaceString(_fileContents, VOLUME_OFF, VOLUME_ON); 
    else 
     result = replaceString(_fileContents, VOLUME_ON, VOLUME_OFF); 

    [fm createFileAtPath: FILE_PATH contents: result attributes: nil]; 
} 
@end 
+1

Возможно, 'NSWorkspace' и/или' NSTask' могут помочь вам с этим? – Eimantas

+0

Запустите его через оболочку с помощью системы («/ bin/sh -c ./myProgram &"); –

+0

Какая она двоичная (консольное приложение или приложение Cocoa)? – trojanfoe

ответ

0

Hacky решение, которое работает (но не элегантно на всех)

мне пришлось заменить

FILE_PATH = [CURRENT_DIR stringByAppendingString: INIT_PATH]; 

с

CURRENT_DIR = [[[[NSBundle mainBundle] bundlePath] stringByDeletingPathExtension] stringByDeletingLastPathComponent]; 

чтобы получить правильный путь к файлу, но работает сейчас.

+0

Да, вам нужно немного почитать. – trojanfoe

Смежные вопросы