VisualStudio2008c開發ActiveX控件及制作CAB包總結_第1頁
VisualStudio2008c開發ActiveX控件及制作CAB包總結_第2頁
VisualStudio2008c開發ActiveX控件及制作CAB包總結_第3頁
VisualStudio2008c開發ActiveX控件及制作CAB包總結_第4頁
VisualStudio2008c開發ActiveX控件及制作CAB包總結_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、開發及測試環境:(1)開發環境:VisualStudio2008SP1cabsdk(下載地址:http:/ )E:日坨日坨iHelloBossma+:jHelloBossmaSetup我這里創建了三個項目:(1)HelloBossma項目模板:Windows 窗體控件庫(2)HelloBossmaSetup項目模板:安裝項目(3)Web:項目模板:ASP.NET 網站3、HelloBossma 項目這個項目用于編寫具體的控件,并生成安裝文件所需要的(1)添加用戶控件:dll。蠢加新膜HelluDdisnu可重用的Window弓窗體控件名稱i;卜底曲口比一配.cs(2)設計控件:“HdtoBos

2、smafidiveX心心vHelloBossmaActiveX.csi+起始可起始可iidiaiuiaUIIBIIUIainiuiiBriuiaiEHaianuiBiiiiiaiaiiiiBiiiiidiBiII.II,午配午配bb 或控件實例或控件實例- -1-添加 Panel、GroupBox、Label 控件。NowTime 是一個 Label 控件,用于顯示時間。然后在控件對應的代碼文件中編寫程序:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Drawing;usin

3、gSystem.Data;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;namespaceHelloBossmaIll類即類即0:模板模板:fl:SVI5U創C#項Web:-WindowsFormsPFPF規碼據w w常代數-ReporUngWorkflow制文件9)安裝程序類0報表向導勺本地數強庫緩存以代碼文件囹光標文件忌搔口.同類關系圉數據集百位圖文件也樣式表因應國程序涔單文件二資源文件總組件類又忤圉報表,本地數據庫:程序集信息文件革調試器可視化工具J基于服務的麴據庫些類二設置文

4、件畫圖標文件回文本文件目應用程序配置文件日用戶控件z自定義控件當前時間當前時間: :NowTimeIIIGuid 將用作控件的 classidIlllObjectSafety 的是用來標記可安全執行腳本的 ActiveX 控件IllGuid(636B8CE1-7512-464C-B63C-FC75BDCA21DB),ProgId(HelloBossma.HelloBossmaActiveX),ComVisible(true)publicpartialclassHelloBossmaActiveX:UserControl,lObjectSafety(privateconststring_IID_

5、IDispatch=00020400-0000-0000-C000-000000000046;privateconststring_IID_IDispatchEx=a6ef9860-c720-11d0-9337-00a0c90dcaa9;privateconststring_IID_IPersistStorage=0000010A-0000-0000-C000-000000000046;privateconststring_IID_IPersistStream=00000109-0000-0000-C000-000000000046;privateconststring_IID_IPersis

6、tPropertyBag=37D84F60-42CB-11CE-8135-00AA004BB851;privateconstintINTERFACESAFE_FOR_UNTRUSTED_CALLER=0 x00000001;privateconstintINTERFACESAFE_FOR_UNTRUSTED_DATA=0 x00000002;privateconstintS_OK=0;privateconstintE_FAIL=unchecked(int)0 x80004005);privateconstintE_NOINTERFACE=unchecked(int)0 x80004002);p

7、rivatebool_fSafeForScripting=true;privatebool_fSafeForInitializing=true;publicHelloBossmaActiveX()InitializeComponent();IIIIII 設置當前時間IIIIIIpublicvoidSetTime(stringtimeStr)(this.label2.Text=timeStr;)publicintGetInterfaceSafetyOptions(refGuidriid,refintpdwSupportedOptions,refintpdwEnabledOptions)(intR

8、slt=E_FAIL;stringstrGUID=riid.ToString(B);pdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;switch(strGUID)(case_IID_IDispatch:case_IID_IDispatchEx:Rslt=S_OK;pdwEnabledOptions=0;if(_fSafeForScripting=true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER;brea

9、k;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:Rslt=S_OK;pdwEnabledOptions=0;if(_fSafeForInitializing=true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt=E_NOINTERFACE;break;returnRslt;publicintSetInterfaceSafetyOptions(refGuidriid,intdwOptionS

10、etMask,intdwEnabledOptions)intRslt=E_FAIL;stringstrGUID=riid.ToString(B);switch(strGUID)case_IID_IDispatch:case_IID_IDispatchEx:if(dwEnabledOptions&dwOptionSetMask)=INTERFACESAFE_FOR_UNTRUSTED_CALLER)&(_fSafeForScripting=true)Rslt=S_OK;break;case_IID_IPersistStorage:case_IID_IPersistStream:c

11、ase_IID_IPersistPropertyBag:if(dwEnabledOptions&dwOptionSetMask)=INTERFACESAFE_FOR_UNTRUSTED_DATA)&(_fSafeForInitializing=true)Rslt=S_OK;break;default:Rslt=E_NOINTERFACE;break;returnRslt;關于 IObjectSafety 的實現參考了:http:/ Com 互操作注冊(4)生成項目,生成這兩個文件:HelloBossma.dllHelloBossma.tlb是必須的,否則生成不成功。4、Hell

12、oBossmaSetup 項目這是一個安裝項目,用來生成安裝程序。(1)在項目上點右鍵,【添加】-【項目輸出】,選擇上邊的 HelloBossma 項目(2)在安裝項目上點右鍵,屬性2J2SJ3平臺平臺| |木可甬木可甬檢出文件名檢出文件名( (山:山:包文件包文件(3:壓縮壓縮:CA0文件大文件大| |乂乂目:目:安裝安裝URL( (前前feleaseVHelloBossmaSetup.msi| |在安裝交件中在安裝交件中*I酰化大小酰化大小ZI6無限制無限制C自定義胭自定義胭););|http:/localhostjhellobossima/安裝 URL:貌似用于查找應用程序更新,具體看:

13、http: C:WindowsSystem32msiexec.exe添加到安裝項目中,然后創建一個快捷方式。在【用戶的程序“菜單下邊】添加一個文件夾HelloBossma,將快捷方式拖動到這里邊。文件系統文件系統(HelloBossmaSetup)=X國目標國目標i工就工就E而文庫系統而文庫系統名嬴名嬴二二 U U應用程序文件夾曦控怦應用程序文件夾曦控怦后以用后以用戶的器戶的器序噪單序噪單HelbBossma二二用尸里面用尸里面卦卦Uninstall.exe在卸載控件上點擊右鍵,屬性:就就 JS(Name)卸載控件卸載控件Arguments!/xA96986A6-AE32-4B6C-91D&a

14、mp;-97C636BIDescriptionFolderHelfoBossmakon函函ShowCmdvsdscNormalTargetUninstaikeKeTransitiveFalseWarkjngFdder唾用程序文件夾唾用程序文件夾設置 Arguments,就是指定要卸載的程序,后面的 ProductCode 可以這樣獲得:解決方案資源管理器解決方案資源管理器- -H閡閡hBu即曰即曰,平,平X刀一刀一解決方案解決方案的皿齦亡的皿齦亡A313個項目個項目) )申申 E;,Web田田HeHoBossiTidHelloEossmaSetupit檢測到的依賴項檢測到的依賴項鼻鼻主輸出來自

15、主輸出來自HElhElci55rn網網活動活動) )國國Uninstall.exe選中項目,然后鼠標放到右側的屬性”上,就可以看到 ProductCode 了:文件,修改文件名為 Uninstall.exe解決方案資源售旌器解決方案資源售旌器- -解法方案解法方案 恥恥 x7亍亍解決方案生解決方案生啊啊* *CA4(3個項酊個項酊(+1jlE:Web+ +;. .更更HelloBowma- -口口HelloBossniaGetLjp由由L檢覬到的儂賴項檢覬到的儂賴項展性,有展性,有 X XHeHoBossmaSetup 部署項目屬性部署項目屬性回到庖B雜項AddRemovePragramsko

16、n( (無無) )Author0O5SMADescriptionDetectNewerlnslalledVersionTrueIntallANUsersFatsKeywordsLocalizationChinese(Simplified)ManufacturerBOSSMAMenuF班班turerLHPostBuildEventPreBuildEvertProductcodeA96986As由由E32-4E6匚匚-94D呂呂-97匚匚8663蜀蜀PraductNameHelloBossma5etupftemavePreviousVersionsFalse(4)最后生成項目5、制作 CAB 文件

17、(1)為了方便操作,可以將 CABARC.EXE 添加到環境變量中:桌面上右擊我的電腦”,屬性“,高級,環境變量”,系統變量”,找到“Path”,在后邊把 CABARC.EXE 所在的路徑添加上去,注意用分號隔開新添加的路徑。(2)準備好文件install.inf:CAB 安裝配置文件HelloBossmaSetup.msi:安裝程序文件install.inf 文件的內容:versionsignature=$CHICAGO$AdvancedINF=2.0SetupHookshook1=hook1hooklrun=msiexec.exe/i%EXTRACT_DIR%HelloBossmaSetu

18、p.msi/qnrun:一般只需要修改這個就行了(3)執行 cabarc 命令桌面左下角開始,運行,輸入 cmd,打開命令提示符工具,進入準備好的文件的目錄,執行命令:cabarcnHelloBossma.cabHelloBossmaSetup.msiinstall.infE:MJenaMlctiueXCABxHaKeCABcabarcnHelloBosna.cabHelloBos&naSetup.ins1installLinfNicrosoftCabinetTool-Uersion1.00-0601C03/18/975CopyrightMicrosoftCo199&-1997

19、.filleightsi*Eserued.CreatinynewcabinetJHelloSo9sna.cabJwithcompressionMgZlP:一一- -addingHeLloBos&naEetup.m&i-addinginstall.infConpletedsuccessfullyE:口 5 心tiuEYCHBxNakeCAB.公游毋在豐公游毋在豐 顯示Completedsuccessfully,打開所在目錄,就可以看到生成的文件了。6、部署到網站在網站中新建一個目錄 hellobossma,將生成的 cab 文件拷貝到里邊。新建一個網頁,將控件添加到頁面:!DOC

20、TYPEhtmlPUBLIC-/W3C/DTDXHTML1.0Transitional/EN/TR/xhtml1/DTD/xhtml1-transitional.dtdhtmlxmlns=/1999/xhtmlscripttype=text/javascriptfunctionSetTime()vard=newDate();varvYear=d.getFullYear();varvMon=d.getMonth()+1;varvDay=d.getDate();varvHour=d.getHours();varvMin=d.getMi

21、nutes();varvSec=d.getSeconds();document.HelloBossma.SetTime(vYear+-+vMon+-+vDay+vHour+:+vMin+:+vSec)ActiveX 控件作為一個 object 添加到頁面中, 其 classid 是在編寫 HelloBossmaActiveX 類時定義好的 Guid 值, codebase用來指示 cab 安裝文件的路徑,還可以設置寬度、高度。另外其中文字受頁面中字體樣式的影響。因為我們的 ActiveX 控件沒有簽名,所以將測試站點加到點”中,并設置安全級別為低”。茶地 Intranet”中或者何信站本地本地

22、 Intranet, ,葭區域適用于在您的葭區域適用于在您的IiLtran.t上上、 找到的所有網站口找到的所有網站口該區域的安全級別該區域的安全級別&)&)該區域的允許級別:全部該區域的允許級別:全部_ _. .他他. . .- -提供最小的安全措施和警告提示提供最小的安全措施和警告提示一一下載大荽數內容下載大荽數內容,且無提示運行且無提示運行.-.- -可以運行所有的活勖內容可以運行所有的活勖內容 -適用于蛆對信任的站點適用于蛆對信任的站點將所有區域重置為默汝級別國將所有區域重置為默汝級別國) )然后打開瀏覽器,提示安裝,點擊安裝”,稍等下,效果就出來了:C#如何在 Act

23、iveX 控件中調用 javascript 的函數,這里參考網上的例子介紹兩種方法,1、方法Internet:常規常規安全安全I隱私隱私內容內容連接連接I程序程序I高鍬高鍬I點擊按鈕,就可以通過 javascript 設置 ActiveX 控件中的時間了。目定義級別目定義級別C).默認蝮別默認蝮別 S)S)雖然代碼不一樣,但是殊途同歸。而且都使用了mshtml。選擇要直看的區域的更改安全設置選擇要直看的區域的更改安全設置可信站可信站Internt站點卷站點卷) )(1)在 VS 項目中添加 Com 對象引用:MicrosoftHtmlObjectLibrary(mshtml.tlb)I添加引用

24、添加引用,NETCOM| |項目項目| |瀏覽瀏覽| |最近最近| |組件名稱組件名稱類型庫版本類型庫版本路徑路徑MicrosoftH323ServiceProvider1LOC:WINDOWSsystenn32h323nnsp.dllMicrosoftHelpDatdServices1,0T,1.0C:PrDgramFilesCommonFilesMicroiMicrosoftHeJpVisuals1.0l.DC:pragramFilesC( (xnmanFilesMicro*IMicrosoFtHTMLObjectLibraryMicrosoftIMAPI2BaseFunctionaryM

25、icrosoftIMAPI2FieSystemIma,MicrosoftInformationCardJEHe!.,.L01,01.0C:WINDOWSsem32lriiapi2.dlC:WITJDOWSsystenn32imapi2F5,dllC:(2) ActiveX 中公將個方法,傳遞window對象到 ActiveX 中ActiveX 中公開一個方法,接受傳遞進來的參數/將 window 對象傳遞進來/Theobj.publicvoidSetHtml(objectobj)html=(mshtml.HTMLWindow2Class)obj;在頁面中調用 ActiveX 的公開方法,傳遞當

26、前 window 對象進去:window.onload=function。document.HelloBossma.SetHtml(this);(3)在 ActiveX 控件中添加一個按鈕,當點擊這個按鈕時,觸發頁面中的C制作配制作配tiv&K控件實例控件實例- -1當前時間:當前時間:NowTimeCallJavascript點擊按鈕的方法:/調用頁面 Javascriptjavascript。IllIIIIllprivatevoidbutton1_Click(objectsender,EventArgse)(html.execScript(CallByActiveX();,java

27、script);)現在卸載掉原來的 ActiveX 控件,安裝新的控件,打開頁面,點擊按鈕,看到如下效果,說明成功。C 制作制作 ActiveX 控控件實例件實例- -1當前時間:當前時間:NowTime顯示當前時間顯示當前時間| |調用 javascript 時還可以傳遞參數,這里不做演示了,自己可以試一下。參考:http:lliubiqularticlesl92632.html2、方法二(1)在 VS 項目中添加 Com 對象引用:MicrosoftHtmlObjectLibrary(mshtml.tlb)和第一種方法相同。(2)用 c#實現兩個 COM 類,IOleClientSite

28、和 lOleContainerusingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceHelloBossmaComImport,Guid(00000118-0000-0000-C000-000000000046),InterfaceType(ComlnterfaceType.InterfacelsIUnknown)publicinterfaceIOleClientSitevoidSaveObject();voidGetMoniker(uin

29、tdwAssign,uintdwWhichMoniker,objectppmk);voidGetContainer(outIOleContainerppContainer);voidShowObject();voidOnShowWindow(boolfShow);voidRequestNewObjectLayout();ComImport,Guid(0000011B-0000-0000-C000-000000000046),InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)publicinterfaceIOleContain

30、er(voidEnumObjects(In,MarshalAs(UnmanagedType.U4)intgrfFlags,Out,MarshalAs(UnmanagedType.LPArray)objectppenum);voidParseDisplayName(In,MarshalAs(UnmanagedType.Interface)objectpbc,MarshalAs(UnmanagedType.BStr)stringpszDisplayName,Out,MarshalAs(UnmanagedType.LPArray)int 口 pchEaten,Out,MarshalAs(Unmana

31、gedType.LPArray)objectppmkOut);voidLockContainer(In,MarshalAs(UnmanagedType.I4)intfLock);(3)在 ActiveX 中編寫 CallJavascript 方法:III/調用 JavascriptIIIIIIThefilenames.privatevoidCallJavaScript(stringparam)(II 反射獲取當前的控件的 ClientSiteTypetypelOleObject=this.GetType().GetInterface(IOleObject,true);objectoleClie

32、ntSite=typeIOleObject.InvokeMember(GetClientSite,BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,null,this,null);II 獲取 ContainerIOleClientSiteoleClientSite2=oleClientSiteasIOleClientSite;IOleContainerpObj;oleClientSite2.GetContainer(outpObj);II 參數數組objectargs=newobject1;args0=par

33、am;II 獲取頁面的 Script 集合IHTMLDocumentpDoc2=(IHTMLDocument)pObj;objectscript=pDoc2.Script;try(/調用 JavaScript 方法 OnScaned 并傳遞參數,因為此方法可能并沒有在頁面中實現,所以要進行異常處理script.GetType().InvokeMember(ShowNowTime,BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,null,script,args);catch點擊按鈕時的操作:/調用 Javas

34、cript/privatevoidbutton1_Click(objectsender,EventArgse)CallJavaScript(this.label2.Text);(4)網頁中的 javascriptfunctionShowNowTime(nowtime)alert(當前時間:+nowtime);卸載原來的 ActiveX 控件,重新安裝,實際效果:_C由由H乍乍Activ4(控控件實例件實例門門當前時間當前時間: :2010-53021329CallJavaschpt(2)修改控件,以區別 版本,修改 V1.0.0 為 V1.0.1殍豆殍豆; ;媼餐控件實例二證媼

35、餐控件實例二證: :五丁五丁一O!9當前時間當前時間: :NwTime顯示當前時間顯示當前時間1、更新 ActiveX 的版本:(1)在 ActiveX 項目上點右鍵,屬性,應用程序,程序集信息,最初的版本是修改為 CallJavascript(3)然后重新生成。2、修改安裝程序(1)添加注冊表項在項目上點右鍵,視圖,注冊表:叫叫I0bject5aFety.es也也IQkClIertMteq.J主輸出主輸出WLlninit文件系文件系堀堀E)重新生成重新生成( (日日視圖視圖文件類型文件類型用戶界面用戶界面(5(5自定義操作自定義操作(0啟動條件啟動條件(U添加添加

36、(Q)安裝安裝卸載儂卸載儂翦切翦切移移除仍重命除仍重命名名 ( ( 由 慝由 慝性性 在 HKEY_CLASSES_ROOT 下創建 CLSID/ActiveX 的 GUID/InstalledVersion/在 InstalledVersion 下新建字符串值,修改字符串的值為”1,0,1,0,注意:刪除名稱中的值,自動會顯示“默認值)”,這樣才能設置注冊表中默認值,不要自己輸入默認值”。妗妗目標計篁機上的注冊表目標計篁機上的注冊表= = -_jHKE_CLAS5E5_ROOTj山山口口CglD:-;啊啊E卜卜了了“W.464C-B$3C. .吁吁75BX42EDp1UInstoltedVe

37、rsion名稱名稱時冢認(2)修改安裝程序版本1屬性屬性二二XHelloBossmaSctup部署項目屋性部署項目屋性H雜QAddRefncveProgramsIcon(無)(無)AuthorBOS5MADescriptionDetectNetverlnstaltedVersionTrueInstallAIlLfsersFalseKey網d號LocadizdtionChineseSimplified)ManufacturerBO5SWAManufacturerUrlPostBuiHEventPreBuildEwentProductCodelDBD6F4-SEE7-4a9F-G3OD-10A0F

38、027B8ProductNameHelloBossmaSetupRemovePreviausVefsioneTrueRunPostBuildEvent成功生成時成功生成時Searchpath5djjed:SupportPhoneSupportUrlTargetPl5tForm熠熠6TitleHellaBossmaSetupUpgradeCcide2ED0FA14-FAFa-4EBO-8540-972Al523D1Version1,0,0修改 Version 為1.0.1,修改 RemovePreviousVersions 為True。(3)重新生成安裝程序3、重新制作 CAB 安裝包cabar

39、cnHelloBossma.cabHelloBossmaSetup.msiinstall.inf4、修改網站(1)將生成的 CAB 安裝包替換原來的安裝包。(2)修改頁面控件版本5、最終效果刷新頁面,提示安裝新的版本,直接安裝就好了。廠廠C常常I作作Act加加X控件定例控件定例.VI。當前葉間:當前葉間:20106612:35:54顯示當前時間顯示當前時間測試 ActiveX 控件在新版操作系統上運行的問題,并提出解決的辦法。主要是 ActiveX 程序兼容性和CAB 文件的安裝問題。我在 VitualPC 上安裝了 Windows7,并且使用 IE8 瀏覽器。1、測試環境:Windows7+

40、IE8出錯行:document.HelloBossma.SetTime(vYear+-+vMon+-+vDay+”+vHour+“:”+vMin+“:”+vSec)然后到控制面中沒有找到安裝的 ActiveX 程序,結合出錯行,大致得出結論:ActiveX 沒有安裝成功!3、修改文件install.inf:versionCallJavascriptX12、修改之前,直接訪問頁面看看,發現出錯了:顯示當前時signature=$CHICAGO$AdvancedINF=2.0SetupHookshook1=hook1DeploymentInstallScope=machinehook1run=%EXTRACT_DIR%run.bat新加Deployment,關于這個項目看:http: 我這里只能用這個,改成 user 無法安裝成功,原因未知。另外在 vista 以后的版本只能執行 cab 中的文件了,所以 msiexec 轉移到了 bat 中執行,添加一個 bat文件。run.bat:setCURDIR=%cd%msiexec.exe/i%CURDIR%HelloBossmaSetup.msi/qn4、制作 CAB 包重新制作 CAB 包,添加一個 run.bat:cabarcnHelloBossma.c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論