【问题标题】:Can a Cocoa app launch the Main() of a SEPARATE Carbon bundle in the same App package?Cocoa 应用程序可以在同一个应用程序包中启动 SEPARATE Carbon 包的 Main() 吗?
【发布时间】:2016-04-25 16:18:33
【问题描述】:

想象一下,如果你愿意,一个 Mac OS X .app 包包含两个程序:一个带有一个返回 NSApplicationMain() 的 Cocoa main(),另一个包含一个带有自己的 main() 的 Carbon 可执行文件。

Cocoa 应用程序用于注册/激活。我们不想将它们分成两个应用程序。我想从 Cocoa main() 内部开始在 Carbon main() 上执行。假设所有代码都已正确签名,是否允许在同一个应用程序包中包含多个带有“main()”的捆绑包,以及如何从 Cocoa 代码中启动 Carbon main()?

【问题讨论】:

  • 您不能使用openURL:launchAppWithBundleIdentifier 或类似的方式启动第二个捆绑包吗?为什么需要从应用内部运行它?
  • @jtbandes -- 相信我,细节很长而且很复杂,但是 Cocoa 代码必须在 Carbon 代码之前运行。只有 Cocoa 代码设置了 Carbon 应用程序所需的内容,Carbon 应用程序才能正常运行。 Cocoa 代码需要调用 Carbon 代码的启动。 launchAppWithBundleIdentifier() 不会在 myApp.app/Contents/info.plist 中查找带有 Bundle Identifier 的应用程序包吗?
  • 好吧,听起来您的 Carbon 应用程序有一个单独的包,所以它可以(应该?)有不同的包 ID。
  • 我从未尝试过这个,但我想dyld 可能是加载和执行另一个包的代码的一种方式,如果你必须这样做的话。
  • 许多应用程序包含它们启动的帮助应用程序。 iTunes 就是一个明显的例子。看看里面;您会找到 iTunesHelper 应用程序。所以我想知道你认为问题是什么。您尝试了吗?当你这样做时,发生了什么?

标签: xcode macos cocoa bundle macos-carbon


【解决方案1】:

我自己并没有真正回答这个问题:Apple DTS 的传奇人物 Eric Sc​​hlegel 传达了一些额外的注意事项,因此我将它们发布在这里,以供其他可能希望追随我不寻常的脚步的人:

我认为这不会以您希望的方式工作。一次 Cocoa 应用程序已运行其事件循环并在窗口中注册 服务器,该进程将被标记为 Cocoa 应用程序。你可能会 如果您尝试完全运行 Carbon,则会遇到奇怪的行为 事件循环和窗口层次结构,因为操作系统中的所有内容都将 认为你有一个 Cocoa 应用程序,即使你真的只是在使用 碳。

在这种情况下,您最好将您的主要 Carbon 应用程序启动为 一个单独的过程。

话虽如此,我认为实际上并没有什么特别之处 难以加载单独的 Carbon 包并运行它。 你只需使用 NSBundle 或 CFBundle 通过 URL 加载包,得到一个 导出的 main() 函数的包中的函数指针,以及 称它为。你走吧。

但是 -- CFBundleGetFunctionPointerForName(myBundle, CFSTR("_main")) 和 CFBundleGetFunctionPointerForName(myBundle, CFSTR("main")) 都不适用于 Carbon .app Mach-o 二进制文件 -- 它返回此错误:

Attempt to load executable of a type that cannot be dynamically loaded for CFBundle

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2012-04-26
    • 2014-04-18
    相关资源
    最近更新 更多