【问题标题】:transparent process creation for cocoa components可可组件的透明流程创建
【发布时间】:2009-11-17 22:01:59
【问题描述】:

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

虽然我知道如果先启动 B 该怎么做,但我想知道:
什么是按需透明启动 B 的基于清洁可可的方法?

(对于那些熟悉 COM 的人,我实际上是在寻找 CoCreateInstance() 等效项)

【问题讨论】:

    标签: objective-c cocoa macos ipc


    【解决方案1】:

    如果这是一个 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:] 变体之一。

    【讨论】:

    • 这看起来很整洁,但我们必须支持 10.5。任何指向解决方案的指针?我假设 GUI 应用程序是指基于应用程序工具包的?
    • @gf - 是的,因为NSWorkspace 是一个 AppKit 类。对于 10.5,使用 -[NSWorkspace launchedApplications] 并遍历数组以查看是否找到 B。如果找不到,请找到 [NSWorkspace absolutePathForAppBundleWithIdentifier:],然后使用 [NSWorkspace launchApplication:] 变体之一。
    • 我还应该补充一点,如果 A 或 B 是非捆绑应用程序,那么 @Chuck 的方法更好。
    • 谢谢,明天去看看。
    • ...冒昧地将 10.5 信息编辑到答案中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2017-08-17
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多