【茶包射手日記】MSCOMCTL.OCX 異常疑案
2 |
2019 年,還要處理 ActiveX Control 在 IE 上的異常,是一種什麼樣的體驗?嗯,差不多是在大草原追逐一百頭羚羊的感覺~ T_T
接到使用者報案,某太平天國年間的網頁作品,其中用了 MSCOMCTL TreeView 控件,在特定使用者的 IE 上無法正常操作。
ActiveX Control 出錯若只是無法載入 OCX 還算簡單,從 IE 有無開放、元件是否註冊查起便是,而這回遇到的狀況很詭異,要命的是控件可載入也能顯示樹狀圖,代表元件註冊與載入都沒問題,但點擊節點就是沒反應。
不幸中的大幸,同事的 Windows 10 + IE11 剛好能重現相同異常,有活體可以解剖做實驗,免去電話遙控使用者擷圖寄回 Email 蒐集線索的坎坷過程,射茶包的痛苦指數由上刀山降成下油鍋。 (這... 刀山變油鍋也算變好哦? 嗯,還是有的,一個要花力氣動腳,一個放著讓它炸就好)
用消去法不斷簡化網頁,整理出突顯問題的最簡版本:
<html>
<body>
<OBJECT id="tvOC" classid="CLSID:C74190B6-8589-11D1-B16A-00C0F0283628"
CODEBASE="../ocx/MSComctl.cab" height="150" width="150">
<PARAM NAME="HideSelection" VALUE="1">
<PARAM NAME="Indentation" VALUE="100">
<PARAM NAME="LineStyle" VALUE="1">
<PARAM NAME="PathSeparator" VALUE="\">
<PARAM NAME="Style" VALUE="6">
<PARAM NAME="ImageList" VALUE="">
<PARAM NAME="BorderStyle" VALUE="1">
</OBJECT>
<script type="text/vbscript">
tvOC.Nodes.Add , , "_ROOT", "ROOT"
Sub tvOC_Click()
MsgBox "Clicked"
End sub
</script>
</body>
</html>
正常 IE 能顯示 TreeView 控件,看到 ROOT 節點,滑鼠點選 TreeView 任意處會跳出 "Clicked" 訊息:
問題 IE 則是可以看到 TreeView 控件及 ROOT 節點,但點擊無反應。初步判定 OCX 載入沒問題,但事件因不明原因無法被觸發。
爬文苦尋不到類似案例,OCX 較常見問題是無法載入,沒看到可以載入但事件失效的。死馬當活馬醫,從 Registry 找到元件位於 C:\Windows\SysWOW64\MSCOMCTL.OCX,比對發現問題 IE 的元件版號與兩台正常機器的不同:
問題主機的 MSCOMCTL.OCX 版本為 6.01.9834(2012年),而正常的兩台則為 6.01.9846(2016年) 以及 6.00.8862(2000年,應來自 MSComctl.cab 安裝),一新一舊,問題主機的版本介於二者中間。
使用 regsvr32 /u 反註冊 6.01.9834 版,先試裝 6.00.8862,狀況更慘,連 TreeView 都無法顯示,再改裝 6.01.9846 後問題排除。
由以上蒐集的資訊還不足以斷定真實原因,但未來如有類似狀況,建議從更換元件版本下手。
A case of MSCOMCTL TreeView control events are not triggered on specific IE clients. Replace different version OCX fixed it.
Comments
# by Aneurin
這篇也可以參考: https://borncity.com/win/2019/02/07/office-update-ships-wrong-mscomctl-ocx-jan-2019/
# by Jeffrey
to Aneurin,感謝補充。