2016-03-15 57 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)創建這些類。

相關問題