为可可组件创建透明的进程

时间:2009-11-16 18:21:52

标签: objective-c cocoa macos ipc

我有一个应用程序 A ,可能需要也可能不需要生成应用程序 B 并使用远程消息传递与它通信(通过 NSConnection s等。)。

虽然如果首先启动 B ,我知道怎么做,我想知道:
根据需要透明地启动 B 的基于可可的干净方法是什么?

(对于熟悉COM的人,我实际上正在寻找CoCreateInstance()等效物)

2 个答案:

答案 0 :(得分:2)

如果这是一个GUI应用程序,你可以为10.6做这样的事情:

NSArray * runningBs = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.example.B"];
if ([runningBs count] == 0) {
  NSURL * bURL = [[NSWorkspace sharedWorkspace] URLForApplicationWithBundleIdentifier:@"com.example.B"];
  NSRunningApplication * b = [[NSWorkspace sharedWorkspace] launchApplicationAtURL:bURL options:NSWorkspaceLaunchDefault configuration:nil error:nil];
}

对于10.5:
使用-[NSWorkspace launchedApplications]并遍历数组以查看是否找到 B 如果不这样做,请找到[NSWorkspace absolutePathForAppBundleWithIdentifier:],然后使用其中一个[NSWorkspace launchApplication:]种类。

答案 1 :(得分:2)

如果其他应用程序是命令行应用程序或行为类似,则NSTask是最佳选择 - 您可以启动另一个程序并定义其标准输入,输出和错误流。如果这是一个GUI应用程序,您可以使用Scripting Bridge或NSWorkspace +使用您自己的通信协议与NSConnection等。