程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VB、VBA、VBS的區別你搞清楚了嗎

VB、VBA、VBS的區別你搞清楚了嗎

編輯:VB綜合教程
 

真是想不到系列之一:VB到底為我們做了什麼?
關鍵字:VB、底層、WIN32、API、COM
難度:中級
要求:熟悉VB,會用VC調試器,了解WIN32 SDK、COM。
VB 一直以來被認為有以下優缺點:優點是上手快、開發效率高;缺點是能力有限,運行效率低。這正是有些軟件把VB做為首選語言,而有些軟件肯定不會用VB做的原因。而很多VC,DELPHI的程序員都認為VB裡搞開發不自由,它讓我們做事變容易的同時,也讓我們發揮的余地越來越小。的確,簡單和功能強大這兩者本身就是一對矛盾。那怕一行代碼不寫,僅僅起動運行一個空窗體這樣簡單動作,VB在底下就為我們做了大量復雜的工作(決不僅僅是注冊窗口類、顯示窗口、起動消息循環這麼簡單),這些工作對程序員是透明的。我們在感謝VB開發小組對我們程序員體貼入微的同時,不禁也要責怪為什麼在文檔中對這些底層的動作只字未提,雖然這些動作對最終的程序也許並無影響,但我們擁有知情權,更何況這些動作有時的確會影響我們的工作(我將在本系列後面的《VB多線程》中談到這種影響)。
然而,所有希望從本文得到"未公開技術秘密"的朋友你將會很失望,因為我能夠知道的和你一樣多,我們所能做的一切就是站在外面來猜VB在裡面做了什麼?所以我決不是要帶大家一起去將VB反向工程,而是想通過猜想VB的內部工作來將一些原來比較模糊的概念搞清楚。作為一個系列的第一篇文章,它的目的是為了後面的深入打下基礎,所以我會在需要的時候指出我們必須掌握的知識點,如果你不清楚,請及時地學習相關書籍來補課,具體見《參考書目》。
最後,要聲明我在本文中所做的各種實驗和推斷僅是我個人的觀點,不能保證其正確性,並且不承擔任何相關的法律責任。
好,開始吧!首先准備好我們的武器,我下面要使用的工具主要有:VB6中文企業版+SP5(廢話),還有SPY++、Dependency Walk和OLE Viewer(以下簡稱SPY和DEPEND和OLEVIEW,SPY在VB光盤的common\tools\vb\下的SPY目錄中,OLEVIEW是其下OLETOOLS目錄中的OLEVIEW.EXE,注意其下還有一個OLE2VW32.EXE功能類似,不過本文所指的是OLEVIEW.EXE,還 Denpend在其下的Unsupprt\DEPEND裡)。還要用用VC(上面提的工具在VC裡有),因為我們還要看看VB生成的代碼,搞VB高級開發的朋友一定要會用VC調試器,懂點匯編更好。當然,本文的重點不在這兒,所以沒有VC也不要緊。
打開VB6新建一標准EXE工程,在"工程"- >"引用"對話框裡應該已有四個引用,簡單點就是:1、Visual Basic For Application(VBA) 2、VB運行時對象庫 3、VB對象庫 4、OLE自動化。前面三個是任何VB工程都必須的,你想不要都不行,不信你試著去掉對它們的引用。那麼這三個核心類型庫各有什麼用,在最終生成的可執行程序中扮演怎樣的角色,這是本文要分析的第一個問題。
1)VB、VBA、VBS的區別你搞清楚了嗎?
首先VBS不應該和VB、VBA放在一起比較,它是微軟按照自己定義的ActiveX Scripting規范完全從頭開始寫成的腳本語言,雖然它的語法結構和VB非常相似,但VBS僅僅依靠自動化對象來擴充其功能(只有後期綁定),它不能用implements來實現接口,不可能在VBS裡直接使用API,沒有VarPtr這樣能得到指針的函數,而VBS缺少的這些功能正是VB和VBA所特有的。當然,這不是說VBS不如VB或VBA,Windows已經為VBS提供了足夠強大的功能,我們可以用VBS來做腳本COM組件,而且借自動化對象的能力VBS可以說能力無限,所以有病毒用VBS來寫,對程序員來說VBS最重要的功能莫過於可以給自己的軟件提供宏功能,就象VC中提供的VBS宏功能那樣。注意,VBS是Free的,這和在Office中使用VBA來提供宏功能不同,要集成VBA需要價格不低的許可證費用,關於腳本語言可參見 MSDN中Platform SDK\Tools and Languages\Scripting。(在本系列後面的文章《腳本功能》中我會實做一個用VBS來提供宏功能的小軟件)
那麼VB和VBA又有什麼不同呢?好吧,眼見為實,開始我們的實驗吧!
如果裝了Office 2000以上版本,那麼打開OLEVIEW,點擊File下的View TypeLib查看位於E:\Program Files\Common Files\Microsoft Shared\VBA\VBA6下的VBE6.dll的類型庫,再用同樣的方法看看MSVBVM60.dll的類型庫,你會發現它們的類型庫基本上一模一樣,除了VBE6多了一個VBEGlobal接口和實現這個接口的Global對象,這個Global對象我們也可以在VBA編程環境(比如用WORD的 VB編輯器)中用對象浏覽器看到。它有二個方法Load和UnLoad,還有一個UserForms屬性,這是因為VBA6使用MS Form 2.0 Form設計器(FM20.dll)來設計和使用UserForm窗體(而在VB6中,我們可以使用多個設計器。比如通過使用MS Form 2.0 Form設計器,我們就能在VB中使用VBA所使用的UserForm用戶窗體)。和VBA的Global對象類似,在VB中也有GLobal對象,從 VB的對象浏覽器中可以知道它在vb6.olb這個類型庫中,這個類型庫就是每個工程都必須引用的VB對象庫,所有的VB內置對象都在這裡。而VBA的 UserForm中使用的對象都在FM20.dll中。
除了上述不同外,VB和VBA還有一個最大的不同,就是VBA不能生成EXE可執行文件,但可以猜想在IDE環境中VBA和VB都要把代碼編譯成p-code來執行,後面我將用實驗來證明的確是這樣,雖然在具體的實現上VB和VBA有很大的不同。
從上面的分析上可以看到VB和VBA還是有很大不同的,這種不同主要體現在編程環境和對象結構上,但在本質上它們之間卻有著不可割捨的血源關系。如果剛才你仔細地觀察了MSVBVM60.dll的類型庫,你就會發現如下的片斷:
// Generated .IDL file (by the OLE/COM Object Viewer)
[
dllname("VBA6.DLL"),
uuid(35BFBDA0-2BCC-1069-82D5-00DD010EDFAA),
helpcontext(0x000f6ec4)
]
module Strings {
[entry(0x60000000), helpcontext(0x000f665f)]
short _stdcall Asc([in] BSTR String);
[entry(0x60000001), helpcontext(0x000f6e9f)]
BSTR _stdcall _B_str_Chr([in] long CharCode);
……………
}
什麼?在MSVBVM60.dll中的對象其方法卻定義在VBA6.DLL中?!VB安裝目錄下不就有個VBA6.DLL嗎?再用OLEVIEW看看它,哇噻,真是想不到它居然和MSVBVM60.DLL的一模一樣。怎麼回事?趕快再拿出DEPEND來看看VBA6.dll、MSVBVM60.dll和 VBE6.dll這三個DLL的輸出函數。哈,又有新發現,我們可以發現在三個DLL的輸出函數中從編號512到717絕大部分都是一模一樣的一些以 rtc開頭的函數,比如595的rtcMsgBox(rtc是什麼?應該是Run Time Component? Control? Code?有誰知道嗎?),這說明三個DLL都有著相同的運行時VBA函數。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved