DXR簡介
作為廣受多媒體開發人員鍾情的開發平台,Director可以根據開發人員的需要輸出多種格式的檔案,其中最常用的格式當屬dir檔案以及加以保護的dxr檔案,後兩種格式的檔案是用於播放的,不可再用Director編輯,一般最終作品都做成這樣的格式。但在我們在實際開發過程中,往往由於備份檔案損壞或出於學習觀摩的目的等種種原因,有必要打開這類檔案作為參考或繼續編輯。本文從技術的角度出發,完全依靠Director自身提供的工具,對dxr檔案的保護與還原手段作一探討,所有討論基於Director8.0。
保護與還原
保護
Director在其IDE環境可通過逐級選擇選單"Xtras"->"Update Movie...",來把檔案改為dxr格式,或通過publish輸入為dcr格式的檔案,不允許再被Director打開或編輯,以此來保護作品不被篡改。這是Director所提供的最基本的保護手段。
還原
不知出於何種考慮,Director所內嵌的lingo語言中有savemovie、save castlib兩個保存movie和cast的命令,而且這兩個命令對於dxr和dcr也有效!正是這兩個命令,為還原被保護的檔案大開方便之門。由於我們不能在Director下直接打開這兩種檔案,於是我們想到了MIAW,把它們通過MIAW打開,Director允許使用tell命令向miaw傳送訊息,因而我們嘗試用這種途徑來遙控dxr保存成可以再編輯的dir檔案。作法如下:
新建一個movie,編寫一個movie script,內容為:
on outputdir input output
miaw=window(input)
tell miaw to savemovie output
forget(miaw)
end
假設我們要打開的檔案是“D:\Locked.dxr”,希望解除保護並另外儲存為“D:\unlocked.dir”,則執行此movie,在message視窗中輸入outputdir "D:\Locked.dxr" "D:\unlocked.dir",然後我們察看D糟根目錄,將會在那裡發現unlocked.dir檔案,這個檔案可以用Director打開,所有的score、member安排與原檔案毫無二致,但其中所有的script內容均為空白。
正如把李白的詩翻譯成英文,再由英文譯成的中文已完全見不到詩仙的影子。由於轉換成dxr格式時,movie內的script都經過編譯,轉換成由計算機執行的代碼。所以用savemovie也不可能得到原來文本格式script,下面談到的所有還原手段對此都無能為力。
目前在Director各論壇上大受青睞的還原工具dirOpener實際上完全基於以上思路來完成的,這個小工具也的確是用Director來製作的。但dirOpener具有一個很好用的界面並補充了一些關於游標和不規則視窗的“秘技”,這為Director初學者提供了一些方便,但對於有一定lingo編程基礎的人來說,它的能力實在有限,不如自己做一個更強的opener,至於理由,請看“再保護”。
再保護
通常開發人員希望全面保護自己的作品,即使是score也不願被他人窺視,怎樣防止別人用savemovie之類的手段來還原呢?還是用lingo!我們可以寫一個處理程式,當movie接收到savemovie命令時不保存movie,而是執行我們所定義的代碼,對於save castlib也做同樣處理。下面的例子是方法之一:
on savemovie
quit
end
on save castlib
quit
end
如果movie script含有以上內容時,則當movie接收到savemovie命令時,不會執行保存,而是退出集成環境或projector,如果企圖用dirOpener還原這樣的dxr檔案,結果將是沒有任何dir或cst檔案輸出,並且dirOpener自身也被退出,這是由quit命令的特點決定的,既然dirOpener是用Director製作的,自然難以逃此噩運,有此軟體的朋友一試便知。
再還原
為了解除用上述savemovie方法施加的保護,我們再次仔細研究一下lingo,發現可以用lingo在runtime動態地增加或刪除member,或修改現有的member的內容。於是我們有了這樣的想法,先檢查一下movie中所有的member,如果是script,則刪除它,自然savemovie之類的保護手段也不存在了。前面已經討論過,還原出來的dir總是丟失所有script內容,所以在這裡刪去它們也不會帶來更多的遺憾。解除所有script作用的代碼(包括保存新的movie部分)如下:
FileToBeOut=the file name to be output --modify it in your scripts
miaw=window(FileToBeOut)
tell miaw
repeat with i=1 to the number of castlibs
repeat with j=1 to the number of members of castlib i
if member(j,i).type=#script then
if member(j,i).scripttype=#movie then
member(j,i).scripttext="" --script內容成為空白,但member名稱會保留
--或者 member(j,i).erase() --整個member被刪除
end if
end if
end repeat
end repeat
--上面的兩層循環查找所有cast中的所有member,並解除所有movie script的作用
savemovie "輸出檔案名稱" --為輸出的檔案命名
end tell
forget(miaw)
至此,基於lingo的保護完全失效。我想在Director的下一個版本中,Macromedia應該不會保留這種雙手互搏之術了。
提示
如果朋友們有興趣,可以在此基礎上包裝一個好界面,自己做一個新的dirOpener。如果希望方便使用,可以用fileio xtra的displayopen和displaysave函式,來選擇要輸入、輸出檔案的位置及檔案名稱。至今我還是不能理解為什麼作為免費軟體的dirOpener要捆綁大而貴的三個net相關的xtras和directOs。
這種方法並不是萬能的,尤其對於dcr檔案,上面的手段往往無所施其技。