最近項目需要用web頁面方式對客戶端硬件進行操作,之前一點沒接觸過,於是乎網上狂找資料。。。。終於歷經一個星期,今天總算大功告成,期間遇到很多困難,在網上前輩們發表過的文章的指引下終於搞定了,欣喜。。。。狂喜。。。下面將我的心得和自己覺得要注意的地方簡單談下,不對的地方還請各位高手斧正。。。。嘻嘻。。。
先介紹下我的項目:用jsp調用客戶端硬件如讀卡器、打印機什麼的。起初想用JNI,但想了一下JNI是在web服務器端進行處理,效率自然沒有在客戶端本地高,於是乎找啊。想啊想 終於找到一種解決方案:ActiveX調用客戶端dll,再用javascript調用ActiveX,最後將參數和結果提交給jsp處理。
這種方法將對客戶端硬件的處理交給頁面中嵌入的ActiveX,但是ActiveX只有瀏覽器核心是IE的纔可用,firefox等這樣的瀏覽器是不能用ActiveX的。沒辦法,就這麼辦吧。
怎麼製作ActiveX具體步驟我就不說了網上有的是,我用的是VC++6.0MFC做的無對話框的ActiveX,因爲之前試了ATL,感覺語法太難懂。MFC開發ActiveX其實跟開發MFC應用程序一樣,只是在創建工程的時候創建MFC ActiveX ControlWizard . 項目創建完以後在classes視圖中下拉接口Dxx中右鍵添加方法,之後在方法中實現調用dll就可以。 我的dll沒有.lib 和.h文件,所以只能動態調用LoadLibrary();不要忘記使用完要FreeLibrary(dllHandle); 其中,在編譯的時候要注意了,要使用release編譯,不要使用debug,使用debug編譯的在本機運行可以但是拿到別人機器上你生成的AxtiveX.ocx控件註冊不上,提示註冊缺少模塊。具體爲什麼我不知道,但是換成release後,就很正常。
編譯完成後會生成.ocx的文件,就是我們需要的ActiveX,注意的是,調用的第三方dll不會編譯進去,是獨立存在的,但是可以在發佈的時候一起放進ActiveX.cab包裏供客戶端下載。在本機測試的時候我們經常需要手動註冊,手動註冊的方法是:regsvr32 AxtiveX目錄/ActiveX.ocx 第三方dll放在system32下(這要看你在實現ActiveX時LoadLibrary的路徑,當然也可放在跟ActiveX同目錄,但是代碼上要改,我用的是放在system32下)。
關於打包成.cab文件,大家可以參考這位老兄的:http://wenku.baidu.com/view/55348421af45b307e8719758.html 也可以到我的csdn下載區下載我已經上傳。
最後就是頁面調用了,將IE-->屬性-->安全-->自定義級別-->下載未簽名的ActiveX控件 中改爲“提示”。調用頁面代碼貼出來:
<html>
<script language="javascript" type="text/javascript">
function button1(){
var s=document.getElementById("mytt");
var val=s.Sum(88,11);
alert(val);
}
</script>
<body>
<input type="button" onclick="return button1()">
<object id="mytt" classid="clsid:DBC8ACFE-D757-40C4-8B1D-0E5E77D2D3B3" codebase="http://192.168.1.8:8080/manager/release/release.cab#version=1,0,0,1"></object>
</body>
</html>
搞定!
有問題可相互交流。我的QQ:827897649
繼續說,在編寫Activex中要實現IObjectSafety接口,連接地址:http://hi.baidu.com/live36524/blog/item/c337bb10432ef703b8127b34.html
推薦的打包方法還是參考這個吧,比上文那個更好:http://blog.csdn.net/cai5/archive/2008/07/29/2731187.aspx