話說公司的ASP不死鳥正努力在Windows 2012R2 x64展開新生活(參考:Windows 2012 R2 x64執行ASP經驗分享),接獲通報,不死鳥因水土不服烙賽,提起藥箱前往探視。

問題出現在某段使用OracleInProcServer.XOraSession又使用自訂WSC元件的VBScript程式:


Set objOra = CreateObject("OracleInProcServer.XOraSession")
Set objWsc = CreateObject("MyComponent.wsc")

遇到的狀況是:從檔案總管直接點擊該vbs會產生ActiveX component can't create object: 'OracleInProcServer.XOraSession'錯誤;若是開Command視窗跑%SystemRoot%\SysWOW64\cscript執行該Script則會冒出ActiveX component can't create object: 'MyComponent.wsc'

註:OracleInProcServer.XOraSession是Oracle古老程式庫(OO4O)中用來連資料庫的ActiveX元件,WSC則是Windows Script Component,一種把WScript包成ActiveX元件的技術。如果讀到這邊,你對以上術語一頭霧水也沒什麼關係,請安心關上網頁出去逛街踏青跑步騎車唱歌看電影都行,不要浪費美好生命讀下去,絕大部分的人此生不會再跟它們有交集。

好了,願意繼續讀到這段的同學,想必都是「ASP不死鳥親衛隊」的成員(不管自願還是非自願),我整理了在Windows x64平台處理WSC註冊的注意事項:

  1. 很多程式有兩份,不要搞混
    在Widows目錄下,除了System32,還有一個SysWOW64,底下都有regsvr32.exe、wscript.exe、cscript.exe、scrobj.dll這幾個檔案。區別在於System32下放的是64位元版regsvr32、cscript、wscript及scrobj.dll;而SysWOW64放的則是32位元版regsvr32、cscript、wscript及scrobj.dll。
    VBScript可以跑64位元,也可以跑32位元,視你用哪個版本的wscript或cscript執行決定。
  2. 在檔案總管直接點擊執行.vbs會跑64位元
    預設Windows x64會用64位元wscript.exe跑vbs檔,而OracleInProcServer.XOraSession為32位元件,VBScript跑64位元時會找不到。改用%SystemRoot%\SysWOW64\cscript Test.vbs才會跑32位元,但認得了OO4O,卻又不認得MyComponent.wsc,底層原因則是WSC被註冊成64位元。這就是本案例遇到的狀況。
  3. 神奇的Regsvr32
    理論上註冊32位元dll要用SysWOW64\regsvr32.exe,註冊64位元dll要用System32\regsvr32.exe,後者明明是64位元,檔名硬是也加了32有詐欺之嫌!但後來發現微軟在兩個版本的regsvr32.exe加了魔法,當用32位元regsvr32註冊64位元的dll,它會自動叫出64位元版regsvr32接手,反之亦然(參考), 故regsvr32.exe與被註冊元件的32/64位元不匹配也不致出錯。看在它這麼聰明的份上,64位元程式檔名亂加32的事我們就不計較了 XD
    (話說,System32放64位元程式,SysWOW64才是32位元,這點更雷。自己搞過一些向前相容的骯髒活兒,倒也能體諒Windows架構設計者的無奈。)
  4. 將WSC註冊到正確版本的Runtime版本
    前面提到,Windows Script Component Runtime(scrobj.dll)也有區分32及64版本,故視你的WSC元件要執行在32還是64環境,必須註冊到正確的版本。
    32位元註冊及解除註冊:參考
    regsvr32 /i:"X:\Path\MyComponent.wsc" %SystemRoot%\SysWOW64\scrobj.dll
    regsvr32 /u /n /i:"X:\Path\MyComponent.wsc" %SystemRoot%\SysWOW64\scrobj.dll
    64位元註冊及解除註冊:
    regsvr32 /i:"X:\Path\MyComponent.wsc" %SystemRoot%\System\scrobj.dll
    regsvr32 /u /n /i:"X:\Path\MyComponent.wsc" %SystemRoot%\System\scrobj.dll

Comments

Be the first to post a comment

Post a comment