objective-c - 使用 'launchedTaskWithLaunchPath' Cocoa/objective-c API 启动应用程序

标签 objective-c cocoa

我需要从应用程序启动“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看看有多少其他可用的方法。

最佳答案

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

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

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

但是,看起来正确的 Cocoa-ish 方法是使用 NSWorkspace,您可以查看它的 openFile:withApplication: 方法,它似乎可以满足您的需要,在这种情况下您可以指定应用程序包目录作为参数,您最初采用的方式。

官方文档是here .

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

关于objective-c - 使用 'launchedTaskWithLaunchPath' Cocoa/objective-c API 启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3330067/

相关文章:

macos - 移动嵌套 NSSplitView 的分割器使其向外生长

cocoa - Spotlight 插件读取 NSDocument 导致控制台中出现 "deny file-write-data"错误

ios - 字段值包含空格或符号时表单提交错误

iphone - editButtonItem 设置但没有减号按钮?

macos - 获取 RAM 信息 OSX

objective-c - NSPersistentDocument 的轻量级迁移

cocoa - 加载的 NSNib 对顶级对象进行排序,没有特定的顺序

objective-c - 带拖动刷新的 TTWebController

objective-c - Objective-C 是否使用字符串池?

objective-c - 自定义查找器(文件夹)图像 w/Cocoa