C#實現ActiveX控件開發與部署

如今,咱們手裏已經有了這個控件包:QRCode.cab,下面咱們編寫一個測試的網頁javascript

<html>
<head>
    <title>無標題頁</title>
    <script type="text/javascript" language="javascript"> 
       
        function Test()
        {            
            qrcodeocx.DecodeQRCode("@UEsDBBQAAAAIADWPjj3wRxgnaAAAAKQAAAAIAAAAemlwRW50cnktjdsNAjEQA1uhgJxke1/ZpDVEOTRBcwR0fzOWZVNowLnTlVkxN+1OSCOAH4TJDvwd+zaBuFCX7EFf8hW1P2/KPHITYmOiFypq1qBiMIL2PAHFERgEw1+jCY9WnsrZBc8LNcGanXl2vlBLAQIUABQAAAAIADWPjj3wRxgnaAAAAKQAAAAIAAAAAAAAAAAAAAAAAAAAAAB6aXBFbnRyeVBLBQYAAAAAAQABADYAAACOAAAAAAA=#");           
            
            if(qrcodeocx.Flag)
            {
                alert("成功!返回"+qrcodeocx.Result);
                document.getElementById("txt").value = qrcodeocx.Result;
            }
            else
            {
                alert("失敗!緣由:"+qrcodeocx.ExceptionMsg);
            }
        }
    </script>

</head>
<body>
    <div>
     <object id="qrcodeocx" codebase="QRCode.cab#version=1,0,0,0" classid="clsid:2865d2a6-9bce-4522-9f39-eddb2887375d"></object>
    </div>
    <input id="Button1" type="button" value="測試" onclick="javascript:Test();" />
    <textarea id ="txt"></textarea>
</body>
</html>

  

codebase="QRCode.cab#version=1,0,0,0" 指明瞭引用控件包的位置和版本(用於控件的升級,後面會講)html

classid="clsid:2865d2a6-9bce-4522-9f39-eddb2887375d"就是以前咱們編寫控件時候,控件的guidjava

 

這樣咱們就能夠在本地或者發佈到iis上測試一下。瀏覽器

過程當中由於簽名等問題有可能會提示安全受限或者沒法安裝之類的,若是你不想一點一點的調整ie安全設置就直接將站點設置爲可信站點,並調低安全級別。安全

而後打開瀏覽器,提示控件安裝,點擊「安裝」測試

這樣控件就部署安裝完成,也就可使用js調用了。網站

 

可是,若是之後咱們的控件須要升級,怎麼辦呢?若是使用以上介紹的方法進行控件的部署,須要按照下列步驟進行升級工做:ui

一、更新Activex的版本:.net

(1)在ActiveX項目上點右鍵,屬性,應用程序,程序集信息,最初的版本是1.0.0.0,修改成1.0.1.03d

(2)從新生成。
二、修改安裝程序

(1)添加註冊表項

在項目上點右鍵,視圖,註冊表:

在HKEY_CLASSES_ROOT下建立CLSID/{ActiveX的GUID}/InstalledVersion/,

在InstalledVersion下新建字符串值,修改字符串的值爲」1,0,1,0″,

注意:刪除名稱中的值,自動會顯示「(默認值)」,這樣才能設置註冊表中默認值,不要本身輸入「默認值」。

(2)修改安裝程序版本

 

修改Version爲」1.0.1″,修改RemovePreviousVersions爲」True」。

(3)從新生成安裝程序

三、從新制做CAB安裝包

四、修改網站代碼

(1)將生成的CAB安裝包替換原來的安裝包。

(2)修改頁面控件版本

<object id="qrcodeocx" codebase="QRCode.cab#version=1,0,1,0" classid="clsid:2865d2a6-9bce-4522-9f39-eddb2887375d"></object>

 

這樣當下一次瀏覽器刷新的時候,就會比較這個版本,並進行相應的升級。這裏的升級其實涉及了兩部分的是升級,一部分是cab的升級,另外一部分是msi的升級,因此這裏要了解兩組升級比較的概念——更新cab的版本和registry的版本:

首先說說cab的版本
cab的版本(即html裏codebase的版本)是會和客戶這兩條registry進行配對
HKCR/CLSID/{GUID}/InstalledVersion

HKCU/Software/Classes/{GUID}/InstalledVersion/(Default)
也就是說,我們須要在安裝msi的時候,在客戶裏寫進這條registry
方法以下︰
在ActiveX Setup安裝項目點擊右鍵 –> 視圖–> 註冊表裏添加

 

生成以後,在安裝msi的時候,regisry便會被寫進客戶的機器
(請注意,[ComRegisterFunction()]這個方法是不行的,因為安裝msi的時候不會執行)

例如︰
請以ActiveX控件的GUID代替如下的GUID,並請保留Registry裏的{}
Registry: HKCR/CLSID/{GUID}/InstalledVersion/(Default) = 「1,2,0,0″
Html: classid=」clsid:GUID」 codebase=」YourProduct.cab#version=1,2,0,0″

這樣客戶在瀏覽你的網頁時,便會把html裏codebase的版本和Registry的版本進行配對,如html的版本較registry的版本新,便會下載並執行cab檔案

第二點是msi的版本
ActiveX Setup項目 –> 屬性 –> 版本
這個版本要比客戶的版本較新,否則在執行msi時便會安裝失敗
另外,也要把移除上一版本」設置爲 true

如下是這兩項設置的目的︰
1. html會和客戶的registry的版本進行配對,發現html的版本較客戶的版本新時,便會下載cab
2. 下載cab後,便會根據inf執行msi or bat檔案,執行msi時,它會自行和上一次安裝的msi版本進行配對,今次的版本較新時,才會繼續安裝

所以兩者也必須更新
順帶一提,若是不寫registry,html是配對的對象會變成.net framework的版本,就是2,0,50727那個,暫時還不知緣由

 

參考:
cab和registry的配對
http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/48335861-2434-4058-9809-186a0bd9e320/

在msi裏添加registry
http://stackoverflow.com/questions/1506858/how-to-get-com-server-for-excel-written-in-vb-net-installed-and-registered-in-aut

相關文章
相關標籤/搜索