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

首頁 > 編程 > VBScript > 正文

VBS技術內幕:CreateObject函數詳解

2020-06-26 17:37:38
字體:
來源:轉載
供稿:網友

曾經我也不明白為什么在CreateObject函數中傳遞不同的字符串就可以創建各種各樣功能強大的對象。后來無意中看到UMU的《[UMU WSH 教程](9)CreateObject 過程》,才知道CreateObject函數創建的是COM對象,第一個參數是COM對象的ProgID。再后來拜讀了Jeff Glatt的《COM in plain C》,知道了如何用純C語言編寫COM組件。

COM(組件對象模型)是一個很復雜的概念,需要用磚頭那么厚的書才能講得清楚,而且沒有C++和面向對象編程背景的話很難理解,比較經典的書有《COM原理與應用》、《COM技術內幕》和《COM本質論》,不過貌似都絕版了。

當然,作為VBSer,我們不需要去理解COM的原理或者本質。簡單的說,COM就是別人寫好的模塊,我們要做的僅僅是調用它,而不必關心它的內部實現,這也是COM技術的一個初衷。ProgID可以認為是開發人員為COM對象起的一個名字,我們把COM對象的名字傳遞給CreateObject函數,告訴它我們想創建這個對象,CreateObject函數就會返回這個對象的指針給你。

例如我可以(當然,你也可以)用VB來編寫一個COM組件,然后給它起個名字demon.tw,那么注冊該COM組件之后,就可以用CreateObject函數來創建了:

Set blog = CreateObject("demon.tw")blog.Open '假設我的COM對象實現了Open方法

我們常用的Scripting.FileSystemObject、WScript.Shell、ADODB.Stream等只不過是微軟開發的系統自帶的COM對象的名字罷了。

那么CreateObject函數是如何創建對象的呢?用OllyDbg跟了一下,核心的代碼大概可以分成四步:

VBS,CreateObject

第一步調用CLSIDFromProgIDEx從ProgID獲取對應的CLSID,如果找不到對應的CLSID,就會報錯“ActiveX 部件不能創建對象”。

我們可以用注冊表編輯器手工查找CLSID。例如要獲取WScript.Shell的CLSID,用注冊表編輯器查找HKEY_CLASSES_ROOT/WScript.Shell/CLSID的值即可。需要注意的是,《[UMU WSH 教程](9)CreateObject 過程》里說:

1、CreateObject 函數先檢查注冊表 HKEY_CLASSES_ROOT/WScript.Shell 下的子鍵 CurVer 的默認值,結果為 WScript.Shell.1,所以知道最新版本是 WScript.Shell.1;

2、讀 HKEY_CLASSES_ROOT/WScript.Shell.1,下面有一個子鍵 CLSID,默認值為 {72C24DD5-D70A-438B-8A42-98424B88AFB8};

這是錯誤的,CreateObject函數(準確的說是其內部調用的CLSIDFromProgIDEx函數)先檢查注冊表子鍵 HKEY_CLASSES_ROOT/WScript.Shell/CLSID是否存在,只要子鍵存在,即使默認值為空或者不是類標識符,都不會再檢查子鍵CurVer ,只有CLSID子鍵不存在,才會檢查子鍵 CurVer。

VBS,CreateObject

第二步調用CoGetClassObject函數獲取IClassFactory接口的指針,如果獲取不到,報錯“ActiveX 部件不能創建對象”或者“類不支持 Automation 操作”,也可能是其他錯誤信息,這取決于COM的實現。

VBS,CreateObject

第三步調用IClassFactory接口的CreateInstance方法獲取IUnknown接口指針,所有的COM都必須支持IUnknown接口,所以這步應該不會出錯。

VBS,CreateObject

最后調用IUnknown接口的QueryInterface方法查詢該COM是非支持IDispatch接口,只有支持IDispatch接口的COM類才能用CreateObject創建對象。如果獲取到IDispatch接口的指針,就可以給VARIANT變量賦值了;如果不支持IDispatch接口,報錯“類不支持 Automation 操作”,也可能是其他錯誤信息,取決于具體實現。

說了半天還是沒有說到一個關鍵的問題:VBS到底能調用哪些對象?或者說,哪些字符串可以作為CreateObject函數的第一個參數?欲知問題答案,請聽下回分解。

VBS深入CreateObject函數

本篇要講的是對象的創建,屬于 COM 的內容,這里不可能說太多,大家可以找一些 COM 的書看看,也可以看看 UMU 的其他關于 COM 的文章:《ATL 體驗》、《基于 WebBrowser 的新型應用程序研究小記》、《學習 ATL 的理由》、《關于 COM 的幾個概念問題》、《關于 COM 的幾個概念問題(2)》。最常見的對象有:WScript.Shell、Scripting.FileSystemObject、Scripting.Dictionary 等,這里以 WScript.Shell 為例。


馬上來看對象的創建過程,語句 Set objWSH = CreateObject( "WScript.Shell" ):

1、CreateObject 函數先檢查注冊表 HKEY_CLASSES_ROOT/WScript.Shell 下的子鍵 CurVer 的默認值,結果為 WScript.Shell.1,所以知道最新版本是 WScript.Shell.1;

2、讀 HKEY_CLASSES_ROOT/WScript.Shell.1,下面有一個子鍵 CLSID,默認值為 {72C24DD5-D70A-438B-8A42-98424B88AFB8};

3、找到了 HKEY_CLASSES_ROOT/CLSID/{72C24DD5-D70A-438B-8A42-98424B88AFB8},子鍵 InProcServer32 的默認值說明服務程序是 C:/WINDOWS/system32/wshom.ocx。

4、對于腳本可以調用的 COM 對象,要使用對象里的方法 TypeLib 是必要的,HKEY_CLASSES_ROOT/CLSID/{72C24DD5-D70A-438B-8A42-98424B88AFB8} /TypeLib 的默認值是 {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B},HKEY_CLASSES_ROOT/TypeLib /{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}/1.0/0/win32 的默認值說明類型庫是 C:/WINDOWS/system32/wshom.ocx。

支持腳本調用的 COM 對象必然要實現 IDispatch 接口,可以從 C:/WINDOWS/system32/wshom.ocx 的“資源 – TYPELIB”里看出來,每個對象開頭的 7 個函數都是 QueryInterface、AddRef、Release、GetTypeInfoCount、GetTypeInfo、 GetIDsOfNames、Invoke,前 3 個是 IUnknown 接口的函數。PE 文件里的 TYPELIB 資源是 *.idl 源碼文件編譯后的類型庫的二進制數據,可以反編譯回去。不過 UMU 推薦使用 eXeScope 查看,即使用 eXeScope 打開 C:/WINDOWS/system32/wshom.ocx,查看“資源 – TYPELIB”,可以看出每個接口函數的參數和返回值定義。

VB 開發環境就是這樣知道對象里有什么函數的。所以,如果我們知道一個對象名,卻不知道這個對象里有什么函數,可以用上面說的方法獲得。

xuejinglan 于 2007年03月31日 星期六 11:40 問 UMU 這樣一個問題:“系統中存在哪些對象,對象有那些函數可以調用,如何知道?”這個問題已經回答后一半了,下面回答前一半。

對象的注冊信息 HKEY_CLASSES_ROOT/CLSID/{GUID} 下可能會有這樣的一些子鍵:Control 說明該組件是一個 ActiveX 控件、Programmable 說明該組件支持自動化、Insertable 說明該組件可以被嵌入到一個 OLE 文檔容器中。能找到 Programmable,說明支持自動化,也就是支持 IDispatch 接口,所以它可以被腳本語言使用。不過這種方式比較老了,現在已經被一個的組件類屬代替,即 Implemented Categories 子鍵下面的 GUID 形式的子鍵。比如 HKEY_CLASSES_ROOT/CLSID/{72C24DD5-D70A-438B-8A42-98424B88AFB8}/Implemented Categories/{40FC6ED5-2438-11CF-A3DB-080036F12502},看一下 HKEY_CLASSES_ROOT/Component Categories/{40FC6ED5-2438-11CF-A3DB-080036F12502} 下的 409 字符串值為 Automation Objects,也就是“自動化對象”。

查找“自動化對象”可以使用 VS 帶的工具 oleview.exe,它專門用來查看 OLE/COM 對象的注冊信息,界面如下圖:

人民群眾可能有點頭暈了,總結一下:組件類屬為 {40FC6ED5-2438-11CF-A3DB-080036F12502}(Automation Objects) 的對象都支持被腳本調用。

接下去的創建過程不屬于腳本應該考慮的范圍,有興趣學 COM 的話可以研究研究,很好的一個機制,值得學習。標題: VBS技術內幕:CreateObject函數
作者: Demon
鏈接: http://demon.tw/reverse/vbscript-internal-createobject.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
秋霞成人午夜鲁丝一区二区三区| 国内外成人免费激情在线视频网站| 亚洲欧美日韩在线高清直播| 国产一级揄自揄精品视频| 国产精品久久av| 国产精品99久久久久久白浆小说| 亚洲最大av网站| 精品爽片免费看久久| 色综合视频一区中文字幕| 国产精品亚洲综合天堂夜夜| 亚洲精品之草原avav久久| 91久久久久久久久久久久久| 久久久久亚洲精品国产| 亚洲国产精品yw在线观看| 亚洲黄色在线看| 亚州成人av在线| 91成人在线播放| 成人性教育视频在线观看| 国产精品久久久久久久久久| 丁香五六月婷婷久久激情| 91国产美女视频| 国产精品美女无圣光视频| 国产精品视频色| 精品国产乱码久久久久酒店| 亚洲石原莉奈一区二区在线观看| 欧美大码xxxx| 久久免费国产视频| 黑人巨大精品欧美一区二区| 国产精品手机播放| 久久久在线免费观看| 亚洲国产精彩中文乱码av| 91久久久亚洲精品| 丝袜亚洲另类欧美重口| 色综合伊人色综合网| 国产精品成人va在线观看| 中文字幕不卡av| 欧美大尺度激情区在线播放| 91精品视频观看| 久久精品一本久久99精品| 91亚洲精品久久久久久久久久久久| 成人久久久久久久| 欧美极品少妇xxxxⅹ喷水| 奇米四色中文综合久久| 国外日韩电影在线观看| 中文字幕日韩视频| 日韩av电影手机在线观看| 国产精品吴梦梦| 91精品国产777在线观看| 精品成人国产在线观看男人呻吟| 色综合久久精品亚洲国产| 国产精欧美一区二区三区| 在线播放日韩精品| 国产91成人video| 亚洲成人黄色在线观看| 国产精品88a∨| 岛国av在线不卡| 日本免费久久高清视频| 亚洲成人黄色在线观看| 高清欧美性猛交| 国产成人精品优优av| 国产精品一区二区久久久久| 欧美成人激情在线| 国产69久久精品成人| 亚洲精品98久久久久久中文字幕| 中文字幕久久久av一区| 亚洲欧美激情一区| 美女精品久久久| 亚洲电影免费观看高清完整版在线观看| 欧美日韩国产在线播放| 日韩中文字幕网站| 欧美性猛交xxxx富婆| 欧美色videos| 国产精品极品美女粉嫩高清在线| 亚洲人成在线观看| 亚洲精品日韩av| 久久久人成影片一区二区三区观看| 亚洲女人天堂色在线7777| 国产成人综合精品| 国产一区二区三区在线播放免费观看| 亚洲天堂男人的天堂| 国产精品91在线观看| 丝袜情趣国产精品| 色777狠狠综合秋免鲁丝| 久久成人人人人精品欧| 成人黄色中文字幕| 性欧美xxxx交| 国产精品白丝jk喷水视频一区| 欧美一级大片在线免费观看| 久久777国产线看观看精品| 日韩精品视频在线免费观看| 欧美一级视频免费在线观看| 欧洲成人免费视频| 日韩精品中文字| 亚洲成人网av| 国产精品自在线| 亚洲影院高清在线| 亚洲 日韩 国产第一| 97精品在线视频| 色妞一区二区三区| 欧美区在线播放| 97香蕉超级碰碰久久免费软件| 久久久久久久久久久国产| 欧美又大又硬又粗bbbbb| 国产精品夫妻激情| 欧美另类极品videosbest最新版本| 欧美亚洲一区在线| 97国产真实伦对白精彩视频8| 亚洲精品理论电影| 久久99久国产精品黄毛片入口| 国产亚洲成av人片在线观看桃| 日韩专区在线观看| 久久99精品国产99久久6尤物| 亚洲va男人天堂| 亚洲最大的网站| 这里只有精品丝袜| 欧美另类xxx| 久久久亚洲天堂| 成人h视频在线观看播放| 国产欧美欧洲在线观看| 午夜免费在线观看精品视频| 68精品久久久久久欧美| 国产成人+综合亚洲+天堂| 18一19gay欧美视频网站| 精品自在线视频| 亚洲第一天堂无码专区| 91在线视频成人| 欧美成人精品xxx| 久久久视频免费观看| 在线观看国产成人av片| 国产91在线视频| 欧美激情精品久久久久久免费印度| 97视频免费观看| 欧美xxxx做受欧美.88| 日韩hd视频在线观看| 国产不卡视频在线| 久久久亚洲福利精品午夜| 日本韩国在线不卡| 91精品国产91久久久久久不卡| 不卡av电影在线观看| 国产亚洲人成a一在线v站| 欧美成人精品h版在线观看| 亚洲精品xxxx| 亚洲精品影视在线观看| 久久久人成影片一区二区三区观看| 一二美女精品欧洲| 欧美与欧洲交xxxx免费观看| 国产精品99久久久久久www| 久久久久久久久久久91| 亚洲精品成人av| 91中文在线视频| 亚洲曰本av电影| 亚洲电影在线观看| www.日本久久久久com.| 亚洲国产成人久久| 国产一区二区三区网站| 亚洲性日韩精品一区二区| 国产精品视频久久| 国产精品亚洲视频在线观看| 欧美成人合集magnet| 国产一区私人高清影院| 国产精品激情av电影在线观看| 日韩有码在线电影| 久久精品99国产精品酒店日本| 亚洲欧美国产日韩中文字幕|