亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

COM 免注冊技術

2019-11-14 11:15:20
字體:
來源:轉載
供稿:網友

今天實際應用時,又進行了一些測試,發現與以前看到資料中一些不同的表現,見最后的【補充】部分

通常,實例化 COM 組件前(包括采用這一技術的 DLL/ActiveX 控件),都需要先用 regsvr32 注冊該組件或控件,從 XP sp2 開始,微軟提供了一種采用 manifest(文件清單)的方式來替代,詳見最后的 MSDN 參考資料。由于 COM 的注冊信息要寫入注冊表,一方面給 Win7 以后沒有管理員身份的應用帶來了麻煩,另一個人一直存在的問題的就是所謂的DLL Hell,造成同一控件不同版本之間的干擾。MS 推出 .Net 時采用了程序集的方式來避免這個問題,同時也用文件清單的方式給 COM 帶來了新的調用方案,由于不需要將類信息寫入注冊表,COM 文件的放置位置也可以放到 exe 所在文件夾或它的子目錄中,自然也就避免了 DLL Hell 的問題。

文件清單是一個 xml 格式的文本文件,其文件名后綴為 manifest(例如:程序名為 a.exe,則這個清單文件名為 a.exe.manifest),創建類實例時,操作系統(實際上是 ole32.dll 的 CoCreateInstance API 函數)會先檢查是否存在清單文件,如果存在有效的清單文件,從把從注冊表獲取 COM 信息的過程就轉變成了從清單文件中讀取。這個文件有很多作用,例如:指定運行時的操作身份權限,是否使用系統主題,以及這里提到的描述 COM 注冊信息,... 等等

如果你用的是 vfp9,當你 build 成 exe 后,用 ResHacker 打開這個 exe 時,你會發現存在一個序號為 24 的資源,其內容為:

(圖一)

是不是很像前面提到的 MSDN 文章中的清單文件?如果你用 eXeScope 打開這個 exe。會發現這個 24 號資源,它就是一個名為 manifest 清單的內容:

(圖二)

也就是說,vfp9 的 exe 編譯時,已經嵌入了一個默認的 manifest

由于 Windows 默認內置的 manifest 優先于外部的 manifest,因此,我們只要寫一個添加了 COM 類聲明的新 manifest,重新編譯后的 exe 就實現了免注冊功能。有一點也許很多人還不知道:vfp9 在編譯 exe 時,如果發現存在與要編譯的 exe 同名的 manifest 文件,就會用它替換掉默認的清單文件。

下面我們就來驗證一下:

1. 創建一個測試用 COM

  a. 新建一項目 -> mycomm

  b. 代碼 -> 新建,粘貼下面內容并保存為 mycom.PRg

Define Class myComFunc as session olepublicFunction getName()	Return 'dkfdtf'EndFuncEndDefine  c. 編譯成 dll

2. 創建一個測試用 EXE

  a. 新建項目 -> test

  b. 代碼 -> 新建,粘貼下面內容并保存為 test.prg

Local oo, ccTry	oo = NewObject('mycom.myComFunc')	cc = oo.getName()	MessageBox("RegFree COM: value = " + cc)Catch	MessageBox('無法創建 COM 對象.')EndTry  c. 編譯成 exe

3. 運行這個 exe,應該看到這樣一個對話框:

(圖三)

4. 現在用  Regsvr32 /u mycomm.dll 注銷掉這個 COM,應該看到這個:

(圖四)

OK,一切都與未使用免注冊技術的情況相符。

現在開始實現免注冊功能,下面的內容只是介紹如何實現你自己應用程序實現免注冊的步驟和方法;只想了解一下的話,只要下載后面的示例包運行就可以了,其中包含了下面的代碼。

1. 在項目所在文件夾,新建一個文本文件,用前面提到的 ResHacker 打開 exe,找到 24號資源,將其中的內容復制粘貼到新建的文本文件中,最后重命名為 test.exe.manifest

,然后用 RegFree 工具包 中的 mt 或 regsvr42 提取 mycom.dll 中注冊信息,加入其中,全部內容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><assemblyIdentity 	version="1.0.0.0" 	type="win32" 	name="Microsoft.VisualFoxPro" 	processorArchitecture="x86"/><description>Visual FoxPro</description><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">	<security>		<requestedPrivileges>			<requestedExecutionLevel level="asInvoker" /> 		</requestedPrivileges>	</security></trustInfo><file name="mycom.dll"><comClass	progid = "mycom.myComFunc"	clsid="{B20DF2B2-7810-4D08-8F3A-2B96786AF03E}"	threadingModel="Apartment" /><typelib	tlbid="{31358D79-374B-49BD-AC99-BFE798831194}"	version="1.0" helpdir="" /></file><dependency>    <dependentAssembly>        <assemblyIdentity            type="win32"            name="Microsoft.Windows.Common-Controls"            version="6.0.0.0"            language="*"            processorArchitecture="x86"            publicKeyToken="6595b64144ccf1df"        />    </dependentAssembly></dependency></assembly>

注釋:上面內容直接從 test.exe 的 24 號資源復制過來,并加入了 <file> ... </file>  COM 類描述信息部分;為簡明起見,這里只加入了必須的類描述元素,另外,如果 mycom.dll 與 test.exe 不在同一文件夾中,需要加上路徑部分,可以是相對或絕對路徑。增加的那些 GUID 值,你也可以直接在 mydll.vbr 中找到。如果是第三方控件,大部分情況下你沒有這個 vbr 文件,所以我提供給你了上面的 RegFree 工具包來從 dll/ocx 中提取這些信息,用法很簡單:

用 mt 來提?。簃t.exe -tlb:TBL文件名 -dll: DLL/OCX文件名 -out: 輸出結果文件名.txt                       沒有專門提供TBL文件的話,TBL就用DLL/OCX 文件

用 regsvr42 提?。簉egsvr42.exe mycom.dll

兩個工具都有缺陷,mt 缺少 progid 項目信息,regsvr42 在 Win7 以上即使以管理員權限運行也可能失敗,在 xp 下運行沒問題

2. 重新編譯 test.exe,vfp 會用上面這個清單文件替換默認的 manifest (24 號資源)

3. 運行 test,應該可以再次看到圖三的畫面。反復用 regsvr32 注冊和注銷 mycom.dll,結果應該都一樣,這說明無論 COM 是否已注冊,都可正常使用;更極端一點,你只復制 mycom.dll 和 test.exe 這兩個文件到其他有 vfp 運行庫的機器上,不用注冊,就可以正常運行。

驗證示例:RegFree.rar

參考:

關于COM的Reg-Free(免注冊)技術簡介及實例講解

Registration-Free Activation of COM Components: A Walkthrough

regsvr42: Generate SxS Manifest Files from Native DLLs for Registration-Free COM

補充:

可以將類描述部分單獨放在清單文件中,不一定要寫入 exe 24 號資源中,也就是說,不更改 vfp 編譯 exe 時默認生成的 24 號資源,另外單獨寫一個清單文件一起發布,不重復的部分不會相互干擾。與上面的示例包中的 mycom.dll 對應的清單文件 test.exe.manifest 如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><file name="mycom.dll"><comClass progid="mycom.myComFunc" clsid="{B20DF2B2-7810-4D08-8F3A-2B96786AF03E}" tlbid="{31358D79-374B-49BD-AC99-BFE798831194}" /></file></assembly>

不過要記住,前面說過,vfp 編譯時如果發現項目文件夾中存在同名的 manifest 文件,就會用它替換默認的清單。所以,如果要單獨發布清單文件(為了便于 COM 版本更新時只更新 dll 而不用更新 exe),就不要把這個文件放在開發機器上項目所在文件夾中。否則,還是像前面描述的那樣比較可靠,將類描述信息插入到復制的默認清單文件中,并在更新 COM 時,同時發布更新的 COM 和重新編譯的 EXE 文件。

補充2:

找到一個比較完美的提取并自動生成清單文件的工具:

http://www.rdctools.com/Downloads/SetupRDCToolsCOMManifestBuilderPro.exe

完全免費(首次運行時會顯示要激活,只要點擊獲取激活碼按鈕,會自動連接到官網,顯示你的激活碼,不需要輸入任何信息)

該工具還有其他一些功能:檢查/添加數字簽名,壓縮,檢查/注冊/注銷 COM/OCX/DLL,等等


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品看片资源| 久久亚洲春色中文字幕| 亚洲电影成人av99爱色| 中文字幕久热精品在线视频| 日韩欧美aaa| 2018中文字幕一区二区三区| 亚洲精品福利在线| 日韩精品在线观看网站| 丝袜亚洲另类欧美重口| 亚洲精品视频免费| 欧美疯狂xxxx大交乱88av| 亚洲老板91色精品久久| 欧美亚洲成人网| 91免费福利视频| 77777少妇光屁股久久一区| 亚洲丁香久久久| 久久久久久久久爱| 91av在线视频观看| 成人a免费视频| 精品久久久久久| 夜夜狂射影院欧美极品| 精品国产31久久久久久| 日韩激情在线视频| 亚洲系列中文字幕| 久久精品中文字幕电影| 主播福利视频一区| 亚洲的天堂在线中文字幕| 亚洲最大福利视频网站| 亚洲午夜精品久久久久久久久久久久| 欧美成人精品在线视频| 日韩免费观看在线观看| 久久国产精彩视频| 欧美插天视频在线播放| 亚洲精品白浆高清久久久久久| 欧美韩国理论所午夜片917电影| 久久精视频免费在线久久完整在线看| 97精品一区二区三区| 日韩国产高清污视频在线观看| 热久久免费国产视频| 亚洲激情视频在线| 中文字幕在线看视频国产欧美| 亚洲mm色国产网站| 国产不卡一区二区在线播放| 中文字幕亚洲一区二区三区| 中文字幕九色91在线| 国产亚洲精品久久久优势| 亚洲最大福利网站| 亚洲欧美另类在线观看| 国产综合香蕉五月婷在线| 国自产精品手机在线观看视频| 日韩精品极品在线观看播放免费视频| 欧美亚洲午夜视频在线观看| 久久精品国产电影| 欧洲日本亚洲国产区| 亚洲欧洲日产国码av系列天堂| 国产极品精品在线观看| 亚洲精品电影网| 高清一区二区三区四区五区| 国产精品综合网站| 成人免费观看网址| 91亚洲永久免费精品| 欧美成人在线免费视频| 国产69久久精品成人看| 亚洲欧洲视频在线| 久久99热精品| 成人午夜一级二级三级| 国产精品美女无圣光视频| 69av成年福利视频| 人妖精品videosex性欧美| 亚洲第一区在线观看| 亚洲国产成人精品久久久国产成人一区| 欧美黑人xxxx| 国产一区二区精品丝袜| 91成品人片a无限观看| 欧美激情一区二区三区在线视频观看| 久久亚洲精品成人| 亚洲欧美资源在线| 91精品国产高清久久久久久| 中文字幕亚洲一区二区三区| 国产精品热视频| 亚洲国产精品一区二区久| 中文字幕一区日韩电影| 亚洲精品丝袜日韩| 91久久国产婷婷一区二区| 在线成人激情黄色| 91视频免费在线| 中文字幕国产精品| 国产精品久久77777| 中文字幕精品国产| 国产精品久久久久久网站| 一区二区三区在线播放欧美| 欧美高清电影在线看| 亚洲xxxx18| 亚洲天堂成人在线| 欧美中文字幕在线播放| 一色桃子一区二区| 97在线视频国产| 国内揄拍国内精品| 国产精品日本精品| 久久精品一本久久99精品| 亚洲欧美综合区自拍另类| 欧美日韩xxxxx| 国产一区二区丝袜| 亚洲午夜未满十八勿入免费观看全集| 国产视频久久久久| 中国日韩欧美久久久久久久久| 国产欧美婷婷中文| 中文字幕欧美视频在线| 久久精品视频网站| 国产精品免费久久久| 日韩高清电影免费观看完整| 精品偷拍一区二区三区在线看| 欧美电影免费观看高清完整| 日韩一区二区三区xxxx| 日韩免费中文字幕| 欧美理论电影在线观看| 91精品国产高清自在线| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久aaaa九色| 亚洲国产精品成人va在线观看| 欧美激情伊人电影| 亚洲资源在线看| 欧美大片在线看| 久久成人精品一区二区三区| 亚洲美女福利视频网站| 色阁综合伊人av| 日韩资源在线观看| 少妇高潮久久久久久潘金莲| 中日韩午夜理伦电影免费| 91精品国产高清久久久久久91| 成人亚洲欧美一区二区三区| 国产91久久婷婷一区二区| 国产亚洲欧洲在线| 日韩大片免费观看视频播放| 久久五月天综合| 成人久久一区二区三区| 国产偷国产偷亚洲清高网站| 国产成人av在线播放| 久久国产精品久久精品| 久久777国产线看观看精品| 日本精品视频在线| 亚洲综合成人婷婷小说| 中文一区二区视频| 久久久www成人免费精品张筱雨| 亚洲第一av网站| 国产成人精品在线观看| 国产一区二区三区在线| 亚洲欧美日韩久久久久久| 欧美国产亚洲精品久久久8v| 日韩精品999| 日韩视频免费看| 亚洲精品国产综合区久久久久久久| 青青草国产精品一区二区| 精品女同一区二区三区在线播放| 国产精品色视频| 97香蕉超级碰碰久久免费的优势| 国产91精品网站| 欧美激情亚洲激情| 38少妇精品导航| 色综合久久久久久中文网| 91精品视频免费观看| 午夜精品一区二区三区av| 超薄丝袜一区二区| 欧美另类极品videosbestfree|