2011-08-15 30 views
9

我有通常以完整的64位模式下运行支持该架构的任何Mac上Cocoa应用程序。强制Cocoa应用程序在32位模式,以开始编程

现在我有一个外部API,它只能作为一个32位插件加载到主程序中。这个API适用于第三方输入设备,只有一小部分用户会购买,但这对于这一小部分很重要。

我的问题是,如果在32位模式下执行该程序只能使用此API。最简单的做法是:

场景1:要求用户通过Finder的获取信息对话框更改其信息,以32位模式启动程序。

这是很容易做到,但几乎没有优雅..

方案2:总是在32位模式下运行,从而避免惩罚98的问题

几乎没有什么我想要做的任何..为了一个奇特的功能,用户的百分比。

方案3:自动改变应用程序的启动属性,以便它在32位模式下一次启动时,它被推出,之后每次

方案4:在启动时,建立正在使用哪个体系结构,则在32位模式下重新发射如有必要

方案3 & 4具有非常小的上记录的问题如何做到这一点,它米ight让我陷入麻烦与Mac App Store指南。

到目前为止,我已经建立:

  • ,使用“牌坊”的命令行工具可以让我重新开始我的可执行文件在32位模式下
  • 查找脚本不会让我改变标志
  • 的“在32位模式下启动”的标志由发射服务API(http://blog.timac.org/?p=490
  • 管理,但我还没有发现任何接口以编程方式更改标志在发射服务API

到目前为止,我只能看到这些选项,其中没有显得特别大:

  1. 重新推出使用NSTask应用和“牌坊”的命令行工具
  2. 写入直接进入com.apple。 LaunchServices.plist
  3. 32位插件隔离到它自己的32位唯一的过程,并使用IPC

方案一可以让我与金管局提交的麻烦。解决方案2在某个阶段几乎肯定会这样做。从用户的角度来看,只有解决方案3是完美的,但为最小的回报增加了大量的复杂性。

任何有关如何“干净地”做出合理努力的建议将不胜感激!

+5

为什么如果你的应用程序只有32位 - 它是否需要大量的内存(> 2 GB)? –

+1

总是在32位模式下运行,这是一种惩罚? – hamstergene

+0

解决方案3听起来最好。 – spudwaffle

回答

3

选项5: 创建另一个始终以32位运行的可执行文件,它的唯一目的是驱动32位组件。从主应用程序启动该可执行文件并使用某种类型的独立于处理器的io互相通信,可能是套接字。

1

您可以通过编程改变什么模式,你的应用程序将通过改变设在这里的plist文件启动:

~/Library/Preferences/com.apple.LaunchServices.plist

您需要更改位于 /LSArchitecturesForX86_64/[your.app.idenitfier]/Item 1/

  • 关键设置它到x86_64将运行在64位
  • 将其设置为i386将r un in 32位

您可以使用内置的defaults命令或内置的plistbuddy命令对其进行编辑。我从未有过多少运气获得一个关键的可水平降至与defaults改变,如果我找出plistbuddy语法,我将它张贴。

一旦你拥有了这一切,你可以创建一个简单的脚本在运行日志中,测试你的输入设备的存在(或其他属性,部门等),并相应地设置启动模式。

2

我想通了,使用默认设置键的方式......

给出一个bash shell变量:

alias="<0000 .... 1234>" #(there is a lot more hex data than that...) 

和包标识符:

bundle="com.mycompany.myprogram" 

可以设置关键因此:

defaults write com.apple.LaunchServices LSArchitecturesForX86_64 -dict-add $bundle "($alias, i386)" 

祝你生成二进制别名。我只是从com.plist.dock中窃取_CFURLAliasData,因为我试图设置为启动32位的程序有一个图标安装在扩展坞中。另一种生成别名的方法是,如果你能掌握它,可能是使用程序dockit.c。我一直无法找到该程序。

+0

如果我查看plisteditor pro,别名变量是否是包标识符下的0键?我想这可能是。无论如何,我认为这里涉及到某种缓存。如果我使用上述Bash方法,则信息对话框的复选框状态不会显示它已更改,除非我强制退出Finder。它必须触发重建它的内部缓存。 看这似乎表明,http://www.thexlab.com/faqs/resetlaunchservices.html –

+0

即使力在quiting我发现特别的应用程序只响应手册信息对话框蜱。换句话说,即使我运行bash脚本来说32bit,并看到它在UI的勾选框中改变,我的应用程序仍然在64位启动。我现在要尝试创建2个.app包的副本。 –

0

我的情况很相似。我使用Ableton Live和Reason作为rewire奴隶。如果我在32位启动Ableton,我需要Reason进入32位模式。这就是我所做的。

  1. 制作应用程序的副本,以便能够快速更改模式。
  2. 调用拷贝32.app(在我的情况Reason32。APP)
  3. 这个新的应用程序中显示包内容和删除文件夹的内容(是的,这一切都包含
  4. 现在进入原来的那个),使内容的符号链接
  5. 符号链接复制到appname32.app包(旧的删除的旧版本所在的地方)
  6. 使用查找器属性并为新副本选择32位模式。

您现在有2个应用程序,你可以轻松地启动/脚本。

相关问题