教程 使用javascript中的OLE Automation
5. 怎樣處理應用程式的執行個體
文件範本是應用程式和它支援的文檔之間的串連。文件範本有兩種類型:單一文檔,它只能一次開啟一個類型的文檔;多文件範本,它允許多個文檔同時被開啟。下面的表格列出了Windows應用程式的各種類型:
單一文件介面(SDI)應用程式
單一文件介面(MDI)應用程式
老類型的應用程式
新類型的應用程式
一個執行個體
多個執行個體
老類型的SDI應用程式只能一次管理一個文檔,但它支援在不需要開始應用程式的另外一個執行個體的情況下關閉一個文檔再開啟另外一個文檔。這樣的應用程式總是支援每次運行應用程式的多個執行個體。從對象的生命週期實施觀點來看,老類型的SDI應用程式是更MDI應用程式是一樣的。
新類型的SDI應用程式可以一次管理一個 文檔對象,但是它不支援在不需要開始應用程式的另外一個執行個體的情況下關閉一個文檔再開啟另外一個文檔。也就是說,如果啟用的文檔關閉,整個應用程式就關閉。當一個新的文檔被開啟,新的應用程式的執行個體就被裝載。如果使用者從應用程式的"File"菜單種選擇"New" 或者"Open",一個新的應用程式的執行個體就被建立以處理這個附加的檔案。這樣的應用程式總是支援一次運行應用程式的。
MDI應用程式使用多文件範本。它可以在應用程式的一個執行個體中管理多個文檔。這種類型的MDI應用程式不支援同時運行應用程式的多個執行個體。每次只有應用程式的一個執行個體可以存在。
MDI應用程式使用多文件範本。它可以在應用程式的單一執行個體中管理多個文檔對象。這種類型的MDI應用程式支援每次運行應用程式的多個執行個體。微軟的Word就一個 MDI應用程式,它支援應用程式的多個執行個體。
使一個給定的應用程式於上面的應用程式類型關聯起來是不困難的。你可以簡單地重複裝載應用程式,並且注意是否每次有新的執行個體被建立。
使用JavaScript中的OLE Automation
5. 怎樣處理應用程式的執行個體
比如,我們裝載微軟的Word三次,微軟的Excel裝載四次,Allaire HomeSite裝載一次,Adobe Photoshop裝載一次,然後看看結果的任務條,如圖1所示。
(圖1)
如圖1所示,你可以看到Word和Excel都支援多個執行個體,而HomeSite和Photoshop不支援。這個任務條知識反應可視應用程式的執行個體。如果應用程式只是通過OLE Automation被裝載,那它就不會出現在任務條上除非它是可見的。因此,你應該使用Ctrl+Alt+Del按鍵組合來裝載Close程式對話方塊(它可以讓你徹底關閉應用程式)。
現在我們可能已經熟悉了執行個體,下面讓我們來看看ActiveXObject() 和GetObject() 函數:
var objVar = new ActiveXObject(class);
如果對象被作為單一執行個體對象進行註冊,那麼對象就只有一個執行個體被建立。不管ActiveXObject()被多少次調用,你將得到對象的相同執行個體的引用。
如果對象示以多個執行個體對象(比如微軟的Word)進行註冊,那麼對象的新執行個體被建立。而ActiveXObject()被調用的次數反應了執行個體的總數。比如 ,如果類為Word.Application,那麼應用程式的新執行個體將被建立。
var objVar = new ActiveXObject(class, servername);
這條語句跟前面的語句是一樣的,但是它在不同的伺服器註冊了ActiveX對象:
var objVar = GetObject(, class);
在Jscript中,這條語句將產生一個錯誤,因為Jscript不接受一個省略的參數緊跟著 一個逗號(,)。但是,這條語句的目的示想在Jscript中實現指定一個空的字串而不是只是為了省略參數。在VB和VBScript中,這條語句將返回對象的執行個體。只有當對象不能發現的時候才會發生錯誤:
var objVar = GetObject("", class);
在Jscript中,這條語句將返回對象的當前執行個體。只有當對象不能發現的時候才會發生錯誤。
使用JavaScript中的OLE Automation
5. 怎樣處理應用程式的執行個體
在VB和VBScript中,這條語句返回對象的新執行個體,除非對象被作為單一執行個體進行註冊,如果是這種情況的話當前的執行個體將被返回。實際上,GetObject()函數的版本就是ActiveXObject()構造器。
var objVar = GetObject(pathname);
如果文檔對象沒運行,對象的伺服器應用程式的新執行個體就被裝載,並且應用程式被通知開啟相應的檔案。這裡值得注意,參數必須代表現有的檔案:
var objVar = GetObject(pathname, class);
即使文檔已經被開啟處於運行應用程式執行個體的狀態下,應用程式新的執行個體總是被裝載。
至此我們已經對ActiveXObject()和GetObject()的各種可能文法進行了討論。最後讓我們看看下面的總結表格:
任務
函數
建立OLE伺服器的新執行個體,它沒有運行
ActiveXObject()
建立OLE伺服器的新執行個體,它已經運行
ActiveXObject()
利用Visual Basic 的ActiveXObject()來建立類的一個執行個體
ActiveXObject()
利用遠程機器的ActiveXObject()建立一個類的執行個體
ActiveXObject()
裝載OLE伺服器並裝載一個subject的執行個體
GetObject()
取回OLE伺服器的現存的執行個體
GetObject()