C++Builder中开发Activex
1.創(chuàng)建自己的ActiveX控件
C++Buider開發(fā)ActiveX的功能非常強(qiáng),但是這方面的資料卻比較少,本人經(jīng)過摸索終于搞定了創(chuàng)建Web方式Activex的基本方法
⑴打開BCB6,新建一個(gè)Activex工程,選擇時(shí)注意選擇ActiveX標(biāo)簽頁(yè)的Active Form
⑵在彈出的對(duì)話框中設(shè)置ActiveX Name為? ActFrm,后面的實(shí)現(xiàn)單元和工程名都會(huì)自動(dòng)更改
⑶勾選Make Control Licensed和Include Version Information,確定之后會(huì)出現(xiàn)一個(gè)和標(biāo)準(zhǔn)Form類似的
⑷在C++Builder自動(dòng)創(chuàng)建的窗體上面添加一個(gè)按鈕,隨便實(shí)現(xiàn)一些功能,如ShowMessage("點(diǎn)擊了按鈕");
⑸設(shè)置Package相關(guān)參數(shù)。你肯定希望自己創(chuàng)建的ocx文件不依賴本機(jī)的開發(fā)環(huán)境,因此必須對(duì)編譯器作適當(dāng)?shù)脑O(shè)置
ⅠProject->Option->Packages去掉Build With Runtime Packages 前面的勾
ⅡProject->Option->Linker? 去掉動(dòng)態(tài)RTL前面的勾,這樣你產(chǎn)生的ocx文件就不會(huì)依賴BCB的開發(fā)環(huán)境了
好了做完上面的步驟,一個(gè)簡(jiǎn)單的Activex就創(chuàng)建完成了,可以選擇Run菜單下的Register ActiveX Server進(jìn)行注冊(cè),你就可以看到你的開發(fā)成果了,如果需要發(fā)布到互聯(lián)網(wǎng)上,通過瀏覽器進(jìn)行注冊(cè)的話,那就需要做下面的設(shè)置
⑹設(shè)置Web Deployment Options
? 點(diǎn)擊Web Deployment Options菜單,出現(xiàn)Web Deployment 選項(xiàng)設(shè)置窗口,有三個(gè)屬性頁(yè)
? Ⅰ Project主要用于設(shè)置Activex文件的位置信息
????? ①Target dir(Full path of the deployed OCX) 設(shè)置OCX目錄,也就是在選擇Project->WebDeploy之后ocx文件將要拷貝到的目錄,我們可以在當(dāng)前工程下建立一個(gè)punlished目錄作為發(fā)布目錄
?????? e.g:當(dāng)前工程目錄為f:\projscts\firstocx? 發(fā)布目錄為f:\projscts\firstocx\published(也就是Target dir)
????? ②Target? URL( Virtual path of the deployed OCX)
?????? 如果客戶端沒有安裝我們制作的activex控件,瀏覽器會(huì)自動(dòng)到指定的網(wǎng)址進(jìn)行尋找
?????? e.g:本機(jī)IP192.168.0.228 端口 8080 虛擬目錄 myapp(使用的Web服務(wù)器是Tomcat,myapp也就是D:\Tomcat\webapps下的目錄)
?????? 此處輸入http://192.168.0.228:8080/myapp/
????? ③HTML dir(Full path of the deployed HTML file)
?????? 和Activex文件配套的html文件的存放位置,這里可以把它設(shè)置成f:\projscts\firstocx\published,主要是為了方便管理
?????? 在General Options下勾選一下四項(xiàng)
?????? a.Use? CAB file compression????????????? b.Deploy? required packages
?????? c.Include file? version number?????????? d.Deploy additional? files
? ⅡPackages 這個(gè)頁(yè)面用于發(fā)布控件中用到的額外的包,因?yàn)槲覀冊(cè)诘?5)步中已經(jīng)去掉了額外的包,所以這一頁(yè)為空
? ⅢAdditonal Files,這一頁(yè)用于發(fā)布其它文件,至于ocx文件有沒有用到其它的文件我們可以使用vc++帶的工具 Dependency Walker來進(jìn)行查看,根據(jù)Dependency Walker的顯示結(jié)果我們知道ocx使用到的dll文件在windows的目錄下已經(jīng)存在,沒有必要隨我們的ocx文件一起發(fā)布
??? 但是由于我們制作控件的時(shí)候選擇了Make Control Licensed,所以隨包一起發(fā)布的應(yīng)該還有一個(gè)lic文件,這個(gè)文件在工程目錄下,我們?cè)贏dditonal Files頁(yè)中點(diǎn)擊Add將lic文件包含進(jìn)來就可以了
??? 這個(gè)lic文件讓我做控件走了不少?gòu)澛?開發(fā)出來的控件在本地可以運(yùn)行良好(也就是在c++builder的run菜單里面使用register Activex server注冊(cè) ),但是一旦移到其它位置總是不能成功,而且最開始的時(shí)候也不知道使用vc++帶的ActiveX Control Test Container工具來測(cè)試已經(jīng)生成的ocx控件
恩,點(diǎn)擊WebDeploy菜單就大功告成了么?沒有。如果我們將published目錄下的內(nèi)容全部拷貝到tomcat的myapp目錄下,然后將IE的安全等級(jí)調(diào)到最低,我們?nèi)匀粺o(wú)法瀏覽剛才生成的ActiveX控件,瀏覽器窗口上面始終顯示一把紅叉。真讓人泄氣
不過不要放棄,我們繼續(xù)進(jìn)行第2步
2.實(shí)現(xiàn)IObjectSafety
? 在IE6以及更高版本的瀏覽器中我們還必須實(shí)現(xiàn)IObjectSafety接口才能保證自己開發(fā)的ocx控件不會(huì)被IE禁用
? 怎么實(shí)現(xiàn)呢?其實(shí)很簡(jiǎn)單,加上幾句話就可以了
? ①打開ActFrm的頭文件,我們最開始的時(shí)候已經(jīng)在這個(gè)Form上面加了一個(gè)按鈕,打開它的頭文件后可以看到一個(gè)類class TAcFrm? 不要管它,跟它沒有什么關(guān)系,接著往下看,可以看到類似
? class ATL_NO_VTABLE TActFrmImpl:
???????? VCLCONTROL_IMPL(TActFrmImpl, ActFrm ..........)之類的代碼,我們?cè)诶ㄌ?hào)之后再給他加個(gè)接口
? 加完之后類似這樣
?? class ATL_NO_VTABLE TActFrmImpl:
???????? VCLCONTROL_IMPL(TActFrmImpl, ActFrm ..........),public IObjectSafetyImpl<TActFrmImpl,INTERFACESAFE_FOR_UNTRUSTED_CALLER>
? 注意不要丟了public前面的逗號(hào),多重繼承必須的
? ②然后再 void InitializeControl(){}函數(shù)結(jié)束之后加入
? 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()
? 編譯通過,應(yīng)該沒有問題
3.添加自定義的方法(接口)
? 我們做的ActiveX控件應(yīng)該要能夠與javascript之類的腳本進(jìn)行交互,所以我們?cè)诳丶幸獙?shí)現(xiàn)自己的接口
? 選擇菜單view->type library出現(xiàn)tlb文件的瀏覽窗口,這里面有一大堆的東西,都不要管它,我們直奔主題,找到IActFrm點(diǎn)擊右鍵新建一個(gè)方法,就叫做ShowValue吧
? 在改方法的parameters頁(yè)中給這個(gè)方法添加一個(gè)參數(shù),參數(shù)名使用longvalue,參數(shù)類型使用variant,點(diǎn)擊刷新按鈕C++builder將自動(dòng)給我們添加一個(gè)叫做ShowValue的方法,參數(shù)類型都設(shè)置好了,我們?cè)谶@個(gè)函數(shù)里面添加ShowMessage(longvalue.iVal);
? 然后在ocx對(duì)應(yīng)的htm文件中添加相應(yīng)的js代碼
? 默認(rèn)生成的htm文件加載activex控件時(shí)是沒有添加ID的,我們需要手動(dòng)給它添加,假設(shè)id="myocx",然后添加一個(gè)js函數(shù)
? <script language="javascript">
???? function testfun(){
?????? myocx.ShowValue(12345);
???? }
? </script>
? 然后在這個(gè)頁(yè)面中添加一個(gè)按鈕,在這個(gè)按鈕的onclick事件中觸發(fā)testfun函數(shù),此處不再嚕蘇
? 記得把這些文件拷貝到服務(wù)器上,不然會(huì)因?yàn)?inf文件找不到而導(dǎo)致activex不能正常顯示
4.使用ActiveX Control Test Container進(jìn)行測(cè)試
? ActiveX Control Test Container是個(gè)好東西,沒有它,我還真不知道我編寫的activex控件那里有問題吶
? 這個(gè)工具隨vc++一起安裝,使用起來非常簡(jiǎn)單,打開之后選擇edit->insert new control從控件列表中選擇一個(gè)activex控件就可以了,這里當(dāng)然是選擇ActFrm羅
5.實(shí)現(xiàn)數(shù)字簽名
? 要是瀏覽器允許你任意下載activex控件的話,故事到這里也就結(jié)束了。可事實(shí)是,為了保證安全,瀏覽器是不會(huì)下載沒有簽名的控件的,如果控件沒有簽名,瀏覽器壓根就不會(huì)給出任何提示,瀏覽器上面只有一把紅叉
? ie有點(diǎn)殘忍哈
? 沒關(guān)系,自己Diy一個(gè)簽名就可以讓瀏覽器給出下載提示框了。
? 制作簽名需要下面這些工具 makecert signcode cert2spc還有如果你需要自己打包ocx的話需要iexpress工具,這個(gè)工具在windows安裝目錄里面有
? 前面三個(gè)工具可以從微軟的官方站點(diǎn)獲取
? 手工編寫一個(gè)bat文件(主要是不習(xí)慣一遍又一遍地敲命令),將這個(gè)bat文件放到f:\projscts\firstocx\published目錄下
? makecert /sv "ActFrmProj1.PVK" /n "CN=公司名稱,E=email,O=作者" ActFrmProj1.cer
? cert2spc ActFrmProj1.cer ActFrmProj1.spc
? signcode
? 當(dāng)然要用到這三條命令的話你必須將這三個(gè)文件的路徑加入到windows環(huán)境變量path中去
? 第一條命令產(chǎn)生ActFrmProj1.cer 和 ActFrmProj1.PVK 兩個(gè)文件
? 第二步將ActFrmProj1.cer 轉(zhuǎn)為ActiveProj1.spc文件
? 這個(gè)過程中會(huì)要求你輸入密碼,自己隨便輸一個(gè),記不記得都沒關(guān)系
? 第三步就是給我們生成的cab文件前面,圖形界面操作很容易
? ①選擇BCB自動(dòng)生成的cab文件,應(yīng)該在f:\projscts\firstocx\published目錄下
? ②簽名類型選擇自定義
? ③從文件選擇一個(gè)證書,這里沒有其它選擇只有一個(gè)文件就是f:\projscts\firstocx\published下的spc文件
? ④私鑰位置選擇CSP中的私鑰
? ⑤密鑰容器選擇ActFrmPrj1.pvk,這個(gè)文件就是第一步生成的那個(gè)pvk
? ⑥算法選擇md5或者sha都可以,然后在其它證書中瀏覽,選擇我們生成的ActFrmProj1.cer搞定了
??
? 然后將puulished目錄下的文件全部拷貝到myapp目錄下,通過瀏覽器進(jìn)行訪問, 瀏覽器會(huì)彈出提示問是否要安裝Activex控件,當(dāng)然選是吶,不然豈不是白忙活了?
6.調(diào)試Activex的技巧
當(dāng)我們使用BCB開發(fā)控件的時(shí)候會(huì)發(fā)現(xiàn)F9不能運(yùn)行,原因就是ocx工作方式和dll文件類似,我們可以通過設(shè)置運(yùn)行參數(shù)來解決這個(gè)問題,Run->Paramters在host appliaction 中選擇ie,e.g:C:\Program Files\Internet Explorer\IEXPLORE.EXE
parameters輸入如下:f:\projscts\firstocx\published\ActiveFrmProj.htm
再按F9就可以直接運(yùn)行了
轉(zhuǎn)載于:https://www.cnblogs.com/meetrice/archive/2010/01/20/1652468.html
總結(jié)
以上是生活随笔為你收集整理的C++Builder中开发Activex的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何才是成功的人
- 下一篇: 转载:static的初始化顺序