将ocx和DLL文件打包成cab文件,inf的编写
From:?http://icrwen.iteye.com/blog/1118766
http://blog.csdn.net/yimiyangguang1314/article/details/6563540
將ocx和DLL文件打包成cab文件,實現IE瀏覽器在線安裝
分類:?Windows應用2010-03-25 18:36?2722人閱讀?評論(14)?收藏?舉報我們打開淘寶等網站時,IE瀏覽器會提示安裝空間,這個控件便是用于對用戶名密碼進行加密的ActiveX控件。如何在我們的站點上安裝如此控件,讓用戶可以通過簡單的點擊便可方便使用我們的空間呢?
下面是如何讓在你的站點上安裝控件的方法。
?
?
?基礎知識
html語言中Object標簽
定義和用法
定義一個嵌入的對象。請使用此元素向您的 XHTML 頁面添加多媒體。此元素允許您規定插入 HTML 文檔中的對象的數據和參數,以及可用來顯示和操作數據的代碼。<object> 標簽用于包含對象,比如圖像、音頻、視頻、Java applets、ActiveX、PDF 以及 Flash。object 的初衷是取代 img 和 applet 元素。不過由于漏洞以及缺乏瀏覽器支持,這一點并未實現。瀏覽器的對象支持有賴于對象類型。不幸的是,主流瀏覽器都使用不同的代碼來加載相同的對象類型。而幸運的是,object 對象提供了解決方案。如果未顯示 object 元素,就會執行位于 <object> 和 </object> 之間的代碼。通過這種方式,我們能夠嵌套多個 object 元素(每個對應一個瀏覽器)。
實例
向HTML中添加對象:
view plain參考
http://www.w3school.com.cn/tags/tag_object.asp
Windows中注冊類ID:clsid
“通用唯一標識符”(UUID),用于標識 COM 組件。每個 COM 組件在 Windows 注冊表中都有自己的 CLSID,以便讓其他應用程序加載。
ActiveX控件CLSID的獲取
在編譯完成每一個ActiveX控件之后,系統會生成ocx.html文件,其中是調用該ActiveX控件的方法。該頁面中有一個標簽即為Object,其中有一行則記錄著該ocx文件的CLSID,如下:
view plain創建cab文件
cab文件中需要包含一系列文件,其中.inf文件會告訴IE如何去安裝這些文件。我們從.inf文件開始怎么寫inf
INF文件的組成有節(Sections),鍵(Key)和值(value)三部分。? 關鍵節有?其它的節可以自定義
最開始一般是[Version]區:?
"Signature"項定義了該INF文件需要運行在何種操作系統版本中。有$Windows NT$, $Chicago$, or $Windows 95$三個值供選擇,一般選擇$Chicago$即可。
接下來就是最重要的[Add.Code]區:?
前面是要下載的文件名,后面是對應這個文件的區域名,可以是任何名字,不過一般都是和文件的名字相同,這樣方便維護。
還有需要注意是在[Add.Code]區出現的文件要根據依賴性進行排序,例如前面說的ctrl1.dll要依賴于ctrl2.dll,則ctrl2.dll要出現在ctrl1.dll的前面。因為安裝時是按照相反的順序進行的,也就是說先安裝ctrl2.dll,然后才是ctrl1.dll,哧哧,記清楚了,不要搞反了。
再接下來是各個文件的區域了?
[Ctrl1.dll]區域中的第一個file值告訴ie到哪里去得到這個dll,file一共包括三個部分,第一部分是file,這個永遠都是這樣的(至少目前來說);第二部分告訴聲明支持的OS,win32表示windows,mac就是蘋果MAC OX了;第三部分是CPU類型,比如說x86、 ppc (Power PC)、 mips或者alpha了。
file的值可以取三個一個URL、ignore和thiscab,如果是URL則說明到URL所在的位置去下;如果是ignore說明對于這種OS和CPU,不需要下載這個文件(ctrl1.dll);如果是thiscab很明顯就在當前的cab文件中了。
接下來是RegisterServer,可以取兩個值yes和no,如果為yes則說明ie要注冊該dll,如果是no就不必了。+如果這里選yes,則需要指定clsid,否則clsid一行可以省略。+
再下來是DestDir,它的值是dll將要存到本地硬盤的位置,如果它的值是10,則將dll放到/Windows或者/WinNT下;如果是11,則放到/Windows/System或者/WinNT/System32下;如果是空(就是沒有值)則會放到/Windows或者/WinNT下的Downloaded Program Files目錄下;
最后是FileVersion,這個就比較明顯了,說明了ctrl1.dll的版本號。
其他部分詳見參考文獻。
創建cab文件
然后就可以將cab文件放到網頁上了
參考
簽名
申請證書
要使用到makecert工具,在VS2005目錄下搜索可以搜索到。
在命令提示行中執行
makecert具體使用幫助可參考創建證書的工具(makecert.exe)
簽名
要使用到signtool工具,也可以在VS2005目錄下找到。
signtool工具有多種使用模式,下面使用的是帶UI的向導模式。
在命令提示行中執行
之后進入signcodewizard:
signtool 的具體使用幫助可參考簽名工具 (SignTool.exe)
?
?
?
?
?
?
ActiveX控件打包cab時INF文件的編寫
分類:?C++2011-06-23 15:12?43人閱讀?評論(1)?收藏?舉報?
雖然微軟對ActiveX越來越不信任,但是這個技術還是很多人喜歡用的,這個博客的編輯器貌似就用到了ActiveX。
在我們編寫好ocx控件后只有在打包成CAB文件加入數字簽名后才能正常發布,如果你用的是vc6,那么問題簡單了,打包完成后不用考慮控件的運行庫問題,現在的XP系統和將要淘汰的2kpro都已經有了這樣的運行庫。但是如果使用的是.net2005就會遇到有關運行庫的問題,這些問題只能依靠CAB壓縮包中的安裝文件?.inf來解決。
首先看看基本的inf文件格式
[version];區域設置
signature="$CHICAGO$"
AdvancedINF=2.0?
[Add.Code]
;該項會指明該安裝包中有哪些項,這里說明包中有ActiveX.ocx、msvcr80.dll、mfc80u.dll、msvcp80.dll?四個項
;這里一般會使用文件名和項名相同的方法,主要是便于維護
ActiveX.ocx=ActiveX.ocx
msvcr80.dll=msvcr80.dll
mfc80u.dll=mfc80u.dll
msvcp80.dll=msvcp80.dll
[ActiveX.ocx]
;這就是Activex控件文件了
file-win32-x86=thiscab?
;表示所需要的這個文件就在當前的安裝包中,file-win32-x86表示該文件是一個win32系統下的文件
clsid={A3B4C60F-24A7-40E8-A06B-1A5EFE5F0A43}
;這里是這個安裝包的GUID這個值是在創建項目的時候系統生成在,一般存放在以項目名命名的idl文件中,使用項目的類信息的GUID
RegisterServer=yes
;說明這個控件是需要注冊的,
;一般情況下只有編寫的文件是需要注冊的,運行庫文件和系統中可能存在的DLL文件是不用注冊的,如MFC70.dll等
FileVersion=1,0,0,1
;這個文件的版本,注意要用逗號隔開
[msvcr80.dll]
;這是ocx控件的第一個依賴文件,有的地方說明依賴文件必須按照依賴順序安裝,可以用"所剩dll都依賴的文件最先安裝”的規則來進行,但是我并沒有在MSDN上看到什么地方有很明確的說明,并且在我自己的測試中也沒有發現有關順序的問題,并且很多地方都是將ocx控件寫在最前面的,但是ocx文件是最依賴其他文件的,貌似按順序寫的做法有點“迷信”
FileVersion=8,00,50727,42
;這里是該dll文件的版本,這里注意下,這個版本可以在文件屬性的版本選項卡中看到,不知道為什么這里顯示的版本號有時會比最外面顯示的版本號多一個0,注意,復制到inf文件后要將點分隔符改成逗號分隔符
hook=mfc80installer
;這個hook是個保留字,說明該項目被掛接到哪里,如果有則表示被掛接到目標項,hook不是一個必填項,這里表示該文件將被掛接到mfc80installer項
[mfc80u.dll]
FileVersion=8,00,50727,42
hook=mfc80installer
?
[msvcp80.dll]
FileVersion=8,00,50727,42
hook=mfc80installer
;上面兩項都跟[msvcr80.dll]一樣,這里就不解釋了
[mfc80installer]
;掛接項
file-win32-x86=http://192.168.1.117/helloactivex/mfc80.cab
;這里表示這個被掛接的文件的位置在一個地址
run=%EXTRACT_DIR%vcredist_x86.exe
;這里表示從這個地址下載到cab包后執行包里面的vcredist_x86.exe文件,%EXTRACT_DIR%表示下載后的解壓目錄
上面有一點沒有說明白,就是“為什么會出現hook這個東西?”,很多的inf文件是這樣寫的
[Add.Code]msvcr80.dll=msvcr80.dll
mfc80u.dll=mfc80u.dll
msvcp80.dll=msvcp80.dll
ActiveX.ocx=ActiveX.ocx
[msvcr80.dll]
file-win32-x86=thiscab
;該文件在當前安裝包中
FileVersion=8,00,50727,42
RegisterServer=no?
;不需要注冊
destdir=11
;該文件將被安裝到系統所在目錄的system32下
;........
我使用這樣的方法在沒有安裝過任何軟件的2kpro和XP下測試過,均安裝失敗,其原因就是運行庫不匹配,如果你的控件是用VS2005的MFC開發的話,使用這樣的方法無法將msvcr80.dll,mfc80u.dll,msvcp80.dll這幾個控件依賴的文件安裝到目標位置的,具體是什么原因我也不明白。
這里的hook就是為了解決上面說的問題:要給被按裝該控件的機器安裝一個運行環境。很多人可能都看過http://support.microsoft.com/kb/167158/這里說明了如何制作一個inf文件,但是很可惜,微軟對mfc的下載支持到VC 6.0就結束了,并且,這里還有一個錯誤,在他的主要示例中有一段
[mfc42installer]???file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab
上面的“VALUE=”是沒有必要的,如果增加了該內容反而會讓安裝包無法下載。
有了在依賴文件dll的項中有了掛接的hook的值后安裝文件會到hook的位置去找需要下載安裝的文件,這里我將/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/Packages/vcredist_x86/vcredist_x86.exe文件做成一個cab文件MFC80.cab,這個包里面只有一個vcredist_x86.exe文件,沒有其他文件。
按照上面的方法打包好mfc8的運行庫并使用hook的方式將Dll和運行庫文件掛接后就可以了。
以上內容在沒有安裝任何軟件的XP和2k pro上測都通過了,順便說下,Activex控件,只要在控件測試的那個工具中跑成了就是好的,如果目標機器上出不來就是環境問題,inf是解決環境問題的唯一途徑。
最后補充一點,上面說的都是在發布Release版本的情況,如果是Debug版本就會少兩個庫文件“MFC80D.DLL”和“MSVCR80D.DLL”
?
?
vc下使用activex控件
http://222.30.226.10/hhcmc/study/teach_vc/teach_sp_24.htm
總結
以上是生活随笔為你收集整理的将ocx和DLL文件打包成cab文件,inf的编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thawte代码签名证书,comodo软
- 下一篇: 数限的历史