2008年7月20日

[VBA / VBScript] What is ProgID?

上週為了解一個怪問題,所以找了關於寫 VBA / VBScript / Javascript create ActiveX Object 時要用到的「ProgID」這個參數的意義,結果找到以下資料:
  1. MSDN 的定義
  2. What is a ProgID and How Do I Change It?
  3. How to determine the Path for an Office Application?

簡單的說,用 VBScript / Javascript Create COM / ActiveX object 時,通常會寫以下的程式:

Dim objWord as object = CreateObject("Word.Application")

其中的 "Word.Application" 就是所謂的 ProgID。


上述第二個參考資料很清楚的解釋了 ProgID 在 COM / ActiveX 裡的重要性,
如果需要在 ASP 或者其他非微軟的語言去 Create COM / ActiveX 物件時,
就需要對 ProgID 有一定程度的了解。


不過對第二個參考資料中,因元件新增功能而產生的 "change ProdID" 的需求,
倒是有其他的作法可以避免 COM 元件升級帶來的麻煩,
只要元件裡面的 public sub/function 的 interface 不變,基本上只要把版本號更新,
runtime 的時候就會抓到最新版本的元件,也不需要去修改 ProgID,
由於Create物件的時候 ProgID 通常都是寫死的(除非原始程式考慮的很周到,用類似 web.config 的方式將 ProgID 存在外部檔案),
不然元件每升級一次,就要全文取代是很痛苦的,ASP 時代根本沒有能跟 VS 相提並論的 IDE (除了 UltraEdit 勉強堪用)。


但是這樣到底要怎麼增加新功能呢?其實只要預留一個 public sub / function,
而這個 function 主要的作用就是接收一個指定 provate sub / function 的字串,
然後根據這個字串來執行指定的 function,這樣就可以了。
新增的功能以 private sub / function 的方式加到舊有的元件中,
而外部的 ASP 程式,因為新增功能本來就要寫新的程式去呼叫,
只要把本來呼叫舊有 sub / function 的程式改為呼叫上述預留的 public sub / function,再把新增的功能的 sub / function name 丟進去就可以了。


至於第三點的參考資料,則是說明到底如何在 registry 中找出 Office 應用程式的 ProgID,而後進一步找出執行檔的 physical path,看來不只是 Office 是採用這樣的機制,只要是在 Windows 平台,很多其他廠商的軟體也是用類似這樣的機制,如 Adobe 等等。


Windows registry 裡面有很多有趣的東西,有空的時候應該多找些相關資料來研究一下...

沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D