項目需求中,有需求:從Javascript中生成ActivexObject對象,然後調用其方法和響應其事件。例如:
<script language="JavaScript" type="text/javascript">
<!--
var assistantCtrl = new ActiveXObject("myActivexCtrl.progId");
assistantCtrl.sayHello("hello");
// -->
</script>
但是new ActiveXObject("myActivexCtrl.progId"); 總是失敗。分析原因爲:IE7對未加數字簽名的 ActiveX dll文件採用的安全策略,不允許生成對象和調用。經過對IE7的安全策略的修改,調爲最安全級別最低,則正常。或者在中級安全時,設置可以下載和運行爲簽名的ActiveX控件也可以。
我的開發環境爲:開發主機Windows XP, VS2008 做的ATL Com ActiveX控件(已經註冊成功並且從其他VC項目中能調用), IE7.
嘗試一1:在我的控件安裝.exe中,將該網站設置爲授信網站,只需要修改註冊表即可。結果失敗。
嘗試—2:數字簽名
於是,從網上找到免費簽名工具signcode.exe,製作cer整出,pvk私鑰,和spc文件,支持在設置時間戳url的地方沒有勾選,最後給dll簽名成功。但是IE7的加載應用的列表裏,我的控件發佈者還是 (未驗證)控件名 的樣子。數字簽名只把控件名顯示出來了,以前是未知名稱。於是測試,還是失敗。網上有人分析,是因爲時間戳url沒有指定,或者指定的url和你的證書不匹配。網上有人提供免費的時間戳url,但是也要用他們的證書來簽名纔可以用。
嘗試—3:
於是另闢蹊徑,查看MSDN,看到我們的ATL 或者 MFC的ActiveX控件,只要實現了IObjectSafety接口就可以不用數字簽名。於是給我的Atl Com類加上:
頭文件中讓你的類繼承:
public IObjectSafetyImpl<CYourComClass,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,
然後在下面的EGIN_COM_MAP加上對IObjectSafety的包含,如下:
EGIN_COM_MAP(CYourComClass)
COM_INTERFACE_ENTRY(IYourComClass)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectSafety)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
經過測試,就算沒有數字簽名和設置授信網站,IE7會提示用戶是否使用該ActiveX控件,顯示的爲未知發行商。至此,該ActiveX控件已經通過了IE的安全攔截,如果想修改發行商名稱,使用方法2中的數字簽名工具給dll簽名即可,但是你的公司名稱前,還有未驗證的字樣。
其他深入的問題還沒有經過研究。有朋友發現可以告訴我。