2016-03-15 65 views
0

我试图将AppleScripting支持添加到我的基于非Cocoa的应用程序。Mac Carbon应用程序中的可脚本化(AppleScript)

我正在处理低级别函数,如AEGetParamDesc,自己处理参数form/want/seld

我的词汇提供了一个类,我们称之为“图像”。它有一个属性“名称”。

我已经得到了一些AppleScript的代码工作,如:

get Images 
get name of every Image 
get count Images 
get every Image 
get first Image 
get Image 1 

所以,基本上,访问的对象和它的属性都有效。

然而,当我尝试了这些类似的访问形式,他们都失败:

get Images whose name = "foo" 

repeat with img in Images 
end repeat 

在第一种情况下,看来我得处理test形式。

在第二种情况下,计数运算符(cnte)不直接请求类对象,而是使用描述索引对象的cobj运算符。

这一切都让我想知道这将会走多远。我需要在代码中单独实现每种可能的Applescript语法和操作符吗?我假设“who”操作符只是简单地将“每个图像”和“图像x的名称”的请求组合起来,就像我可以在Applescript中单独编写它们的方式一样,而不是对它们中的每一个使用不同的AppleEvent公式。

whose <boolean-test>相同。为什么AppleScript不会简单地执行name = "foo"本身的相等性测试,因为它是一个文本比较,根本不需要涉及我的应用程序代码呢?

有什么我失踪了吗?我可以将这些转发给AE功能吗?我还没有意识到,还是我必须自己处理所有可能的比较和流量控制命令?

回答

1

Thomas Tempelmann(Find Any File fame?),如果你真的不能在Cocoa中重写应用程序,这里有一篇文章是我多年前写的关于编码的一些细节(用C语言编写的) ,包括处理formWhose,你在上面问过。

http://www.mactech.com/articles/develop/issue_28/reuter.html

这篇文章是由苹果公司在其开发杂志上发表,并包含源代码,我写了一个名为“素描”示例应用程序。这是苹果发布其自己的示例项目“素描”之前的几年。如果它能帮助你,我仍然有源代码。

祝你好运!

+0

是的,我是FAF的作者,试图将Scriptability添加到它,实际上:) 有趣的 - 我一直在看当前的Sketch2源,它使用NS类,它神奇地处理所有复杂的东西。我会对使用古老API的旧版本非常感兴趣。 我现在来看看链接的文章,也许这已经是我所需要的了。 –

+0

呵呵,虽然文章处理“其”的术语,但似乎没有任何特定的代码来处理测试(例如“is”和“=”)。但是我看到了对AEResolve的调用,到目前为止我还没有使用过自己。我想知道AEResolve是否对我有用?很难弄清楚苹果已经删除了所有这些旧文档。将需要做更多的挖掘。 –

+0

预Cocoa AS引擎对你必须安装的处理程序使用回调机制,其中AEResolve类似于交换终端,它不断询问令牌,然后用该令牌等调用你的方法,直到它获得了令牌请求的类型包含请求的数据。这花了很多粗糙的代码,包括AETE资源,但是一旦你掌握了它,它就是可行的。 Cocoa通常更容易,它使用字符串查找调用类和方法的魔力,所以在SDEF中,AS术语与Cocoa方法的映射更为清晰。 –

2

Apple事件对象模型专为OS(系统7)上的高延迟IPC而设计,可以每秒执行60次上下文切换。可以在多个对象上操作的复杂查询和过程允许使用更少的跨进程消息完成更多工作。此外,它的设计是一个相对较厚的视图 - 控制器抽象,强调UI/UX,将用户数据的理想化视图呈现为关系图,无论底层数据如何实际存储,或者复杂或难以实现实现VC代码从一个映射到另一个可能。 AEOM与关系型数据库相比,与OOP世界中的任何东西相比都更为常见,而最接近苹果事件IPC的类比则是通过XML-RPC发送XQueries。有关背景看:

http://www.cs.utexas.edu/~wcook/Drafts/2006/ashopl.pdf

如今,当然,OS X可以做到每秒上千次的进程切换的不费吹灰之力,所以有实现一个复杂的AE视图 - 控制器只是为了获得可接受的性能必然少。 TBH,我建议你节省自己的时间,并实施简单,可靠,快速工作的最简单的RPC。限制处理器将状态变为每个消息在单个对象上的操作(因为在数组上执行Set操作会得到正确的结果),实现找到对象所需的最简单的查询表单,并返回基本上作为安全指针的ID标识符以前识别的对象,以便用户可以使用更多命令快速操作它们,而无需重复往返复杂的完整查询。

哦,除非你有特别的理由要使用C,否则我建议只使用NSAppleEventDescriptor和NSAppleEventManager。 C苹果事件管理器API自10.6以来是古老的,粗糙的和遗留的,因此不推荐用于新的开发。你可能(重复,也许)甚至找到一种方法来使用一些Cocoa Scripting类来完成一些繁重的工作。对象说明符,尽管CS本身非常糟糕,并且与ApplicationKit非常耦合,所以不要浪费时间搞乱它,除非它确实有用(CS已经埋葬了更好的项目)。

另一件事情当然是整个Mac Automation生态系统处于彻底濒临死亡的状态,并且在当前管理下不太可能取得更好的效果,所以开发一个完整的先进AEOM的成本与收益从头开始只是没有更多。如果“简单,快速,安全和愚蠢”对于任何你希望吸引的用户来说都“足够好”,就这么做。

+0

感谢您的背景信息。我还考虑通过Automator Action插件提供对应用程序数据的访问,但这并不容易,因为在我的正在运行的应用程序和Action插件之间缺乏简单的数据传输方式。不,它不是用C语言编写的,而是用Xojo(以前称为REALbasic)编写的,所以我必须在这里处理另一层复杂的问题,并且需要使用我必须处理的自定义方法进行子类化的动态对象越少,越容易。除非NS类为我在这个问题中描述的类型做更多的工作。他们会吗? –

+0

顺便说一句,在哪里可以找到一个脚本应用程序可能遇到的所有AE相关代码的完整列表?我的意思是诸如测试,cobj等代码。在当前的Apple开发文档中找不到它们,甚至没有使用Google搜索。做任何旧的AppleScript书籍封面应用程序开发?它们主要看起来是为AppleScript用户编写的,而不是针对应用程序开发者的。 –

+0

更新:看起来好老的Inside Mac包含类型代码。毕竟,十年前不应该把这些书带走!尽管如此,我不能相信周围没有任何图书馆或框架能够以更智能和通用的方式处理所有这些运营商。我不能成为第一个处理这个问题的人。 –

0

Apple的sample code for Sketch提供了一个使用Cocoa Scripting API的好例子。

示例代码不会对“repeat”和“who”执行任何特殊处理,但它可以使用这些术语运行AppleScript。

这表明可可脚本,即主要是NSScriptObjectSpecifiers.h中的类和协议,负责处理旧的Carbon API所暴露的复杂操作。

因此,基于@foo的答案,似乎很聪明地创建基于NSObject(NSScriptObjectSpecifiers)的代理类,实现objectSpecifier方法以及获取/设置访问器的任何属性,然后使用引用这些类在.sdef文件中。即使没有Objective C,也可以使用ObjC运行时函数(如objc_registerClassPair)创建这些类。

相关问题