Delphi XE7 開發ActiveX 及在IntraWeb下調試

最近學習DelphiXE7下Intraweb開發,Intraweb徹底服務器端運行使得FastReport報表系統沒法在客戶端運行,固然網上也有一大堆解決方案,例如導出到PDF後,給出鏈接,讓客戶點擊下載等,我的感受不完美。因爲我作的B/S系統主要運行在windows平臺,因此仍是考慮ActiveX插件,來的直觀。
1、DelphiXE7下 ActiveX開發

一、new-other-打開窗口,選擇ActiveX Library,點擊OK按鈕web

 

二、出現這樣一個界面,此時Delphi創建一個無窗口的框架,生成3個單元:_TLB,.ridl及工程文件算法

 

三、點擊 新建項  按鈕,並選擇第一個Active Form  點擊肯定sql

 

 

四、此時Delphi爲咱們創建了一個窗口,這裏就是咱們要實現功能的地方,我在這個窗口裏面添加了ado鏈接,adodataset,報表控件及一個按鈕,窗口名稱我命名爲pgformexpress

 

 

五、爲咱們的ActiveX插件添加屬性及方法:點擊ridl單元在ipgform,在這個ActiveX form的接口部分右擊,彈出菜單,這裏能夠爲這個插件添加新的接口,屬性,及方法,數據模塊等windows

 

 

六、注意右邊的Type屬性裏面要選擇BSTR(delphi裏面的wideString),點擊上面的刷新按鈕,delphi會在unit1裏面自動添加此屬性的實現方法的框架瀏覽器

 

 

 

這裏,我將這個新添加的屬性命名爲SQL,並在form 的private部分添加一個私有成員_sql用來保存這個屬性值。同時用一樣的方法,我添加一個方法ShowS,此時能夠實現這個ShowS方法,完成必定的功能。這個屬性和方法能夠被Intraweb調用,後面再講調用如何調用

七、在_TLB單元找到這個form的GUID(這個單元裏面有不少GUID,記住是form的,不是其餘的),這個GUID很重要,在下面的Intraweb裏面調用ActiveX時須要用到。在本例當中就是最下面那個GUID,CLASS_pgform:TGUID=xxxxxxxxxxxxxxx服務器

 

 

八、完成上面的屬性和方法功能後,能夠保存項目了,而後編譯生成OCX文件


2、在Intraweb中調用ActiveX

一、新建Intraweb項目就不說了,在窗口中添加一個IWACtiveX控件,這個控件就是用來加載咱們的ActiveX的框架

 

 

這裏主要設置兩個屬性:一是ClassID屬性,二是CodeBase屬性,ClassID就是咱們上面提到的那個GUID,CodeBase就是要加載的OCX的文件名,本例中我用的是cab控價包。/files/zz.cab,其中 第一個正斜槓/ 表明着咱們的DLL文件所在的文件夾(或者是wwwroot 文件夾),後面的files文件夾與咱們DLL文件在同級文件夾中,當用戶瀏覽次網頁時,瀏覽器會提示安裝ActiveX控件,選擇安裝便可。
重點內容:Intraweb調用ActiveX中的方法
我在IWForm的OnRender事件中寫了下面的代碼,固然也能夠在其餘地方寫,如OnCreate,總之目的是給IWForm的JavaScript屬性添加JavaScript代碼。本例的代碼是經過ID來查找網頁中的ActiveX對象,賦值它的屬性SQL,並調用它的方法ShowRP(上面說的是是ShowS,名字不一樣而已),字符串部分的代碼要符合JavaScript語法,而不是delphi語法。本例中定義了一個JavaScript函數,這個函數調用咱們的ActiveX控件的屬性和方法,其實Intraweb中對ActiveX的訪問,跟Intraweb無關,徹底有JavaScript控制ActiveX,上面說的 IWActiveX控件只是負責用JavaScript語言在咱們的網頁中插入ActiveX對象,它訪問不了ActiveX,只能用JavaScript訪問ActiveX對象。

而後在IWBUTTON的ScriptEvents屬性中調用這個JavaScript函數RepPrint();ide

 

 

 

這就是上面的IWACTIVEX控件的做用,用JavaScript語言插入一個ActiveX控件 ,剩下的事,他就作不了了。 函數

 

下面說說如何建立cab及簽名

3、建立cab及簽名

一、建立cab
用windows自帶的iexpress建立cab包,在開始,運行中輸入iexpress 出現下面窗口

 

 

選擇Create new建立一個新的,點擊下一步

 

這裏要選擇最下面一個選項,建立一個自解壓的ActiveX安裝格式的cab,點擊下一步

 

 

這裏,點擊add按鈕選擇剛纔咱們編譯好的ocx文件,點擊下一步

 

 

這裏點擊browse瀏覽文件夾,選擇你想保存的位置及文件名,並把最下面一個複選框打鉤,意思是保存長文件名

 

 

這個窗口意思是,是否保存這個cab的臨時文件以備之後編輯,這裏我選擇了不保存,而後一直點擊下一步就完成了
二、建立證書及簽名
首先下載一個SignTool簽名工具http://www.pfeng.org/tools/signtool.rar 
而後在cmd命令窗口中鍵入:
makecert -sv printocx.pvk -r -n "CN=KeHong Company" printocx.cer
這裏的
"CN=KeHong Company" 是簽名名稱能夠隨便改,pvk是密碼文件,cer是證書文件,固然文件名你能夠本身指定

 

 

點擊回車鍵後,會出現一個窗口要求輸入密碼,這個窗口要出現三次,請輸入相同的密碼

 

 

肯定之後,證書就建立完畢了

 

 

三、用這個證書籤名咱們的cab控件包
在咱們下載的SignTool工具包中有一個簽名工具signcode.EXE,運行它

 

 

 

點擊下一步選擇咱們剛纔創建的cab控件包,我這裏選擇的是OCX,方法是同樣的,下一步

 

 

這裏要選擇自定,才能夠在接下來的過程當中選擇咱們剛纔建立的cer證書文件

 

 

點擊從文件選擇,彈出窗口,選擇咱們剛纔建立的cer證書文件並點擊下一步

 

 

這裏要求選擇密碼文件,就是咱們建立證書時候同時生成的那個pvk文件,點擊下一步

 

 

而後輸入建立證書時候設定的密碼,點擊肯定

 

 

隨便選擇一種加密算法,點擊下一步

 

 

直接點擊下一步

 

 

一路點擊下一步,要求輸入密碼的時候輸入密碼,完成

4、證書的安裝
上面敘述了ActiveX開發,cab打包,證書建立,簽名及在Intraweb中調用ActiveX,其實很簡單。
是否是這樣就必定能夠了呢?不必定!因爲咱們的cab簽名不是信任機構簽發的(聽說弄一個信任機構頒發的證書年費就要400美圓 ),因此還須要把簽名cab控件包的cer證書安裝到受信任的根證書區域,不然瀏覽器可能會阻止安裝咱們的ActiveX插件。
當瀏覽器阻止咱們的插件時(客戶端),會彈出一個窗口,上面有一個 「發佈者」能夠點擊,而後能夠查看這個插件簽名的證書,點擊查看證書,出現下面的窗口

 

 

點擊安裝證書,並選擇第二個選項,指定位置安裝

 

 

點擊瀏覽按鈕,出現選擇證書的安裝位置,此時要選擇「受信任的根證書頒發機構」安裝成功後,IE再次加載咱們的ActiveX控件時,提示安裝,點擊安裝便可。

 

 

5、OCX控件版本的控制

同一個CLASSID的ActiveX控件一旦註冊到客戶端機器中,每一個支持OCX控件的瀏覽器都會自動加載。
可是若是咱們的OCX控件功能升級了, 客戶端使用的仍然是舊版本的OCX控件怎麼辦呢?總不至於在客戶端電腦手動刪除已註冊的控件吧?解決的辦法就是OCX的版本控制:同時改變OCX控件的文件版本和Intraweb中IWACTIVEX的CodeBase中的版本號能夠達到此目的(這兩個版本號必定要相同,不然客戶端每次刷新頁面,都要安裝一次控件,挺煩人的哦) 

一、改變OCX控件的文件版本號
在上面的ActiveX開發例子中,編譯成OCX以前,點擊project-options打開對話框,找到Version頁,能夠看到文件的版本號設定,以下圖所示
主版本號默認是1,後面默認是0,改變這個版本號。這裏,我把主版本號改成4,編譯生成OCX

 

 

二、在Intraweb中改變CodeBase中的版本號

本例上面講到的ActiveX調用中,CodeBase不帶版本號,這裏咱們用下面所示的方法,加上版本號。#version=4,0意思是,讓客戶端瀏覽器在調用這個ocx時,檢查已註冊的ocx版本是不是4,0,若是是就調用,不然就從新下載安裝。注意這裏的4,0 中間是逗號,不是句號!
好了,從新編譯這個dll,覆蓋到網站根目錄下,打開這個網頁試試,瀏覽器會提示從新下載這個控件並安裝。

 

相關文章
相關標籤/搜索