【问题标题】:Launching App using 'launchedTaskWithLaunchPath' Cocoa/objective-c API使用 'launchedTaskWithLaunchPath' Cocoa/objective-c API 启动应用程序
【发布时间】:2018-07-06 22:13:27
【问题描述】:

我需要从应用程序启动“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”。

添加

我可以让它运行如下。

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

我问another question 看看还有多少其他方法可用。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    在这种情况下,无效参数是应用程序的名称。

    如果您查看 NSTask 的文档,您会发现您使用的方法基本上是低级 exec() 系统调用的包装器。这意味着您需要提供实际可执行文件或二进制文件的名称,以便它能够创建进程。在您的情况下,您给它一个目录(使用终端确认 /Applications 中的大多数应用程序包都是目录)。这就是它呕吐的原因。

    您可以在 TextMate 的捆绑目录中查找实际的可执行文件(应该在 /Applications/TextMate.app/Contents/MacOS 中的某个位置)。然后你可以修改你的代码来调用实际的可执行文件。

    但是,似乎正确的 Cocoa 风格的方法是使用 NSWorkspace,您可能会查看它的 openFile:withApplication: 方法,该方法似乎可以满足您的需求,在这种情况下您需要指定将应用程序包目录作为参数,按照您最初的方式。

    官方文档是here

    顺便说一句,我不能完全相信它;请参阅this StackOverflow answer 了解有关此主题的更多信息。

    【讨论】:

      【解决方案2】:

      您正在尝试启动目录,而不是二进制文件。

      【讨论】:

        【解决方案3】:

        随着沙盒的开始,如果您尝试启动自己,这将不再起作用,并且会因“forbidden-sandbox-reinit”而失败。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多