1.建立自己的ActiveX控制項
C++Buider開發ActiveX的功能非常強,但是這方面的資料卻比較少,本人經過摸索終於搞定了建立Web方式Activex的基本方法
⑴開啟BCB6,建立一個Activex工程,選擇時注意選擇ActiveX標籤頁的Active Form
⑵在彈出的對話方塊中設定ActiveX Name為 ActFrm,後面的實現單元和工程名都會自動更改
⑶勾選Make Control Licensed和Include Version Information,確定之後會出現一個和標準Form類似的
⑷在C++Builder自動建立的表單上面添加一個按鈕,隨便實現一些功能,如ShowMessage("點擊了按鈕");
⑸設定Package相關參數。你肯定希望自己建立的ocx檔案不依賴原生開發環境,因此必須對編譯器作適當的設定
ⅠProject->Option->Packages去掉Build With Runtime Packages 前面的勾
ⅡProject->Option->Linker 去掉動態RTL前面的勾,這樣你產生的ocx檔案就不會依賴BCB的開發環境了
好了做完上面的步驟,一個簡單的Activex就建立完成了,可以選擇Run菜單下的Register ActiveX Server進行註冊,你就可以看到你的開發成果了,如果需要發布到互連網上,通過瀏覽器進行註冊的話,那就需要做下面的設定
⑹設定Web Deployment Options
點擊Web Deployment Options菜單,出現Web Deployment 選項設定視窗,有三個屬性頁面
Ⅰ Project主要用於設定Activex檔案的位置資訊
①Target dir(Full path of the deployed OCX) 設定OCX目錄,也就是在選擇Project->WebDeploy之後ocx檔案將要拷貝到的目錄,我們可以在當前工程下建立一個punlished目錄作為發布目錄
e.g:當前工程目錄為f:\projscts\firstocx 發布目錄為f:\projscts\firstocx\published(也就是Target dir)
②Target URL( Virtual path of the deployed OCX)
如果用戶端沒有安裝我們製作的activex控制項,瀏覽器會自動到指定的網址進行尋找
e.g:本機IP192.168.0.228 連接埠 8080 虛擬目錄 myapp(使用的Web伺服器是Tomcat,myapp也就是D:\Tomcat\webapps下的目錄)
此處輸入http://192.168.0.228:8080/myapp/
③HTML dir(Full path of the deployed HTML file)
和Activex檔案配套的html檔案的存放位置,這裡可以把它設定成f:\projscts\firstocx\published,主要是為了方便管理
在General Options下勾選一下四項
a.Use CAB file compression b.Deploy required packages
c.Include file version number d.Deploy additional files
ⅡPackages 這個頁面用於發布控制項中用到的額外的包,因為我們在第(5)步中已經去掉了額外的包,所以這一頁為空白
ⅢAdditonal Files,這一頁用於發布其它檔案,至於ocx檔案有沒有用到其它的檔案我們可以使用vc++帶的工具 Dependency Walker來進行查看,根據 Dependency Walker的顯示結果我們知道ocx使用到的dll檔案在windows的目錄下已經存在,沒有必要隨我們的ocx檔案一起發布
但是由於我們製作控制項的時候選擇了Make Control Licensed,所以隨包一起發布的應該還有一個lic檔案,這個檔案在工程目錄下,我們在Additonal Files頁中點擊Add將lic檔案包含進來就可以了
這個lic檔案讓我做控制項走了不少彎路,開發出來的控制項在本地可以運行良好(也就是在c++builder的run菜單裡面使用register Activex server註冊 ),但是一旦移到其它位置總是不能成功,而且最開始的時候也不知道使用vc++帶的ActiveX Control Test Container工具來測試已經產生的ocx控制項
恩,點擊WebDeploy菜單就大功告成了麼?沒有。如果我們將published目錄下的內容全部拷貝到tomcat的myapp目錄下,然後將IE的安全等級調到最低,我們仍然無法瀏覽剛才產生的ActiveX控制項,瀏覽器視窗上面始終顯示一把紅叉。真讓人泄氣
不過不要放棄,我們繼續進行第2步
2.實現IObjectSafety
在IE6以及更高版本的瀏覽器中我們還必須實現IObjectSafety介面才能保證自己開發的ocx控制項不會被IE禁用
怎麼實現呢?其實很簡單,加上幾句話就可以了
①開啟ActFrm的標頭檔,我們最開始的時候已經在這個Form上面加了一個按鈕,開啟它的標頭檔後可以看到一個類class TAcFrm 不要管它,跟它沒有什麼關係,接著往下看,可以看到類似
class ATL_NO_VTABLE TActFrmImpl:
VCLCONTROL_IMPL(TActFrmImpl, ActFrm ..........)之類的代碼,我們在括弧之後再給他加個介面
加完之後類似這樣
class ATL_NO_VTABLE TActFrmImpl:
VCLCONTROL_IMPL(TActFrmImpl, ActFrm ..........),public IObjectSafetyImpl<TActiveFormXImpl,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>
注意不要丟了public前面的逗號,多重繼承必須的
②然後再 void InitializeControl(){}函數結束之後加入
BEGIN_CATEGORY_MAP(TActFrmImpl)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()
③BEGIN_COM_MAP(TActFrmImpl)
VCL_CONTROL_COM_INTERFACE_ENTRIES(IActiveFrmX)
COM_INTERFACE_ENTRY(IObjectSafety)//加入這樣一行就ok了
END_COM_MAP()
編譯通過,應該沒有問題
3.添加自訂的方法(介面)
我們做的ActiveX控制項應該要能夠與javascript之類的指令碼進行互動,所以我們在控制項中要實現自己的介面
選擇菜單view->type library出現tlb檔案的瀏覽視窗,這裡面有一大堆的東西,都不要管它,我們直奔主題,找到IActFrm點擊右鍵建立一個方法,就叫做ShowValue吧
在改方法的parameters頁中給這個方法添加一個參數,參數名使用longvalue,參數類型使用variant,點擊重新整理按鈕C++builder將自動給我們添加一個叫做ShowValue的方法,參數類型都設定好了,我們在這個函數裡面添加ShowMessage(longvalue.iVal);
然後在ocx對應的htm檔案中添加相應的js代碼
預設產生的htm檔案載入activex控制項時是沒有添加ID的,我們需要手動給它添加,假設id="myocx",然後添加一個js函數
<script language="javascript">
function testfun(){
myocx.ShowValue(12345);
}
</script>
然後在這個頁面中添加一個按鈕,在這個按鈕的onclick事件中觸發testfun函數,此處不再嚕囌,
還有一點就是,Activex的GUID和版本資訊在BCB開發時的ActFrmProj1.tlb視窗上看到。
記得把這些檔案拷貝到伺服器上,不然會因為.inf檔案找不到而導致activex不能正常顯示
4.使用ActiveX Control Test Container進行測試
ActiveX Control Test Container是個好東西,沒有它,我還真不知道我編寫的activex控制項那裡有問題呐
這個工具隨vc++一起安裝,使用起來非常簡單,開啟之後選擇edit->insert new control從控制項列表中選擇一個activex控制項就可以了,這裡當然是選擇ActFrm羅
5.實現數位簽章
要是瀏覽器允許你任意下載activex控制項的話,故事到這裡也就結束了。可事實是,為了保證安全,瀏覽器是不會下載沒有簽名的控制項的,如果控制項沒有簽名,瀏覽器壓根就不會給出任何提示,瀏覽器上面只有一把紅叉
ie有點殘忍哈
沒關係,自己Diy一個簽名就可以讓瀏覽器給出下載提示框了。
製作簽名需要下面這些工具 makecert signcode cert2spc還有如果你需要自己打包ocx的話需要iexpress工具,這個工具在windows安裝目錄裡面有
前面三個工具可以從微軟的官方網站擷取
手工編寫一個bat檔案(主要是不習慣一遍又一遍地敲命令),將這個bat檔案放到f:\projscts\firstocx\published目錄下
makecert /sv "ActFrmProj1.PVK" /n "CN=公司名稱,E=email,O=作者" ActFrmProj1.cer
cert2spc ActFrmProj1.cer ActFrmProj1.spc
signcode
當然要用到這三條命令的話你必須將這三個檔案的路徑加入到windows環境變數path中去
第一條命令產生ActFrmProj1.cer 和 ActFrmProj1.PVK 兩個檔案
第二步將ActFrmProj1.cer 轉為ActiveProj1.spc檔案
這個過程中會要求你輸入密碼,自己隨便輸一個,記不記得都沒關係
第三步就是給我們產生的cab檔案前面,圖形介面操作很容易
①選擇BCB自動產生的cab檔案,應該在f:\projscts\firstocx\published目錄下
②簽名類型選擇自訂
③從檔案選擇一個認證,這裡沒有其它選擇只有一個檔案就是f:\projscts\firstocx\published下的spc檔案
④私密金鑰位置選擇CSP中的私密金鑰
⑤密鑰容器選擇ActFrmPrj1.pvk,這個檔案就是第一步產生的那個pvk
⑥演算法選擇md5或者sha都可以,然後在其它認證中瀏覽,選擇我們產生的ActFrmProj1.cer搞定了
然後將puulished目錄下的檔案全部拷貝到myapp目錄下,通過瀏覽器進行訪問, 瀏覽器會彈出提示問是否要安裝Activex控制項,當然選是呐,不然豈不是白忙活了?
6.調試Activex的技巧
當我們使用BCB開發控制項的時候會發現F9不能運行,原因就是ocx工作方式和dll檔案類似,我們可以通過設定運行參數來解決這個問題,Run->Paramters在host appliaction 中選擇ie,e.g:C:\Program Files\Internet Explorer\IEXPLORE.EXE
parameters輸入如下:f:\projscts\firstocx\published\ActiveFrmProj.htm
再按F9就可以直接運行了