国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
VB程序大揭秘(出處:Yesky 作者:不詳)
VB 程序大揭秘 

  1.Visual Basic程序概況

  我用W32Dasm(Ver 8.93)解開一個比較復(fù)雜的VB程序,其中用到了許多API 函數(shù)比如GetPrivateProfileString、OSfCreateShellLink、SHBrowseForFolder 等來自很多DLL的API。解開以后卻發(fā)現(xiàn)程序只用到了一個DLL:msvbvm60.dll(我用的還是VB6)!VC、Delphi等程序語言編譯出的程序可是直接引用DLL的。經(jīng)過研究發(fā)現(xiàn)程序使用了如下幾個主要的來自MSVBVM60.dll的API:

rtcRandomize :Randomize 函數(shù)的對應(yīng)API;
rtcMidCharVar :Mid 函數(shù)的對應(yīng)API;
rtcLeftCharVar、rtcRightCharVar :看出來了吧,這些是Left、Right函數(shù)的對應(yīng)API;
rtcUpperCaseVar :UCase 函數(shù)的對應(yīng)API;
rtcKillFiles :Kill 語句的對應(yīng)API;
rtcFileCopy :FileCopy 語句的對應(yīng)API;
rtcFileLength :EOF、FileLen函數(shù)的對應(yīng)API;
rtcGetTimer :Randomize Timer中獲取Timer的對應(yīng)API;
rtcShell :Shell函數(shù)的的對應(yīng)API;
rtcMakeDir :MkDir 語句的對應(yīng)API;
rtcRemoveDir :RmDir 語句的對應(yīng)API;
rtcDir :Dir 函數(shù)的對應(yīng)API;
rtcSpaceVar :Space 函數(shù)的對應(yīng)API;

  沒問題的人應(yīng)該看出來了:VB的所有函數(shù)、語句、方法都是由調(diào)用MSVBVM60.dll 中的API實現(xiàn)的,一般是由“rtc”接上函數(shù)或語句的全名,涉及字符串的API一般還得在最后加上“Var”。
 
另外還有一些函數(shù)是這樣寫的:

__vbaUbound : UBound 的對應(yīng)API;
__vbaFileOpen :Open 語句的對應(yīng)API;
__vbaStrCmp :比較兩個字符串:If String1 = String2 Then ......
__vbaVarOr :Or 運(yùn)算符的對應(yīng)API;
__vbaRedim :Redim 語句的對應(yīng)API;
__vbaRedimPreserve :Redim 語句加上 Preserve 參數(shù)的對應(yīng)API;
__vbaGet、vbaPut :Get、Put語句的對應(yīng)API……

  在運(yùn)行時,VB程序就調(diào)用它們完成工作。

  2.其它DLL的調(diào)用

  第一部分解決了。我們知道了VB程序?qū)嶋H上不是一個真正的可執(zhí)行文件,它只是機(jī)械性地調(diào)用MSVBVM60.dll中的API執(zhí)行程序。那么VB程序既然只調(diào)用了MSVBVM60.dll,它又是怎樣調(diào)用其他DLL中的API呢?

  注意這個API。它能引起我們的注意:

  DllFunctionCall:看到了嗎?它就是我們的主角。

  從字面上看就能看懂了:它用來調(diào)用其它DLL。這樣可以使程序使用的函數(shù)集中在MSVBVM60.dll里(怎么有點像封建制度,中央集權(quán)……)。

  3.重中之重:VB程序的啟動

  我們已經(jīng)知道了VB程序的運(yùn)行方法。那么它是怎樣啟動的呢?

  再看看程序調(diào)用的API。其中有一個API雷打不動,每個VB程序都有:

  ThunRTMain

  首先,VB程序調(diào)用ThunRTMain。ThunRTMain為程序初始化進(jìn)程,并獲取進(jìn)程ID。

  隨后它加載vb6chs.dll,為打開新窗口準(zhǔn)備。然后它開始用LoadString等API 獲取窗口屬性,比如字體、標(biāo)題、顏色等。再調(diào)用IMM32.dll,開始利用它打開新窗口。然后使用GetModuleFileName獲得VB程序名,隨后用CreateSemaphore增加信號機(jī)。信號機(jī)的作用是:當(dāng)監(jiān)控值大于0時,信號機(jī)工作。再調(diào)用OLE32.dll,使用CreateWindowEx打開一個叫做“DDE Server”的隱藏窗口,讓它從中作梗。退出OLE32.DLL,MSVBVM60又開始調(diào)用程序管理器。

  前面的工作為我們的VB程序注冊了一個類名:VBFocusRT5,下面就可以使用這個類名創(chuàng)建VB窗體。首先使用大量循環(huán)讀取半角/全角字符,然后讀取各個控件的屬性,再使用Local_Function把這些屬性、方法、事件等“拼”成一個完整的控件,最后把上面做的所有工作綜合起來,開始VB程序。

  從過程來看,使用時間最多的自然是加載控件了,其次是加載字符集。VB程序速度慢主要是指啟動速度慢。這是難以避免的,希望VB7推出時能改進(jìn)這一點。

  不知大家看沒看出來,編譯后的VB程序只是源程序的翻版,連控件屬性、方法和事件名都一模一樣。VB程序的慢就是來自這里,它們只是機(jī)械地、無休止地調(diào)用MSVBVM60.dll里的API來運(yùn)行程序。要想徹底擺脫這一點,只能改革VB程序編譯時的方法,使其成為一個標(biāo)準(zhǔn)的資源性Win32程序。

  附:VB程序與VC++程序啟動速度大火拼

  注意:這里提到的只是“啟動”速度。實際上,VB程序啟動后的運(yùn)行速度與其它程序語言編譯出來的EXE速度差不多(甚至更快),只不過是啟動速度太慢而已。

  我們知道,Windows附帶的計算器是用VC++編制的。我編了一個示例計算器程序,流程很簡單,單擊Command1時把Text1與Text2相加,再賦值到Text3。

  代碼只有一行:

  Private Sub Command1_Click()

  Text3 = CStr(Val(Text1) + Val(Text2))

  End Sub

  把它編譯為EXE。為了表現(xiàn)出速度差異,我選擇了一臺比較慢的電腦:

  Pentium 166 MMX + 80M EDO + 3.2G硬盤。

  啟動速度對比:為了結(jié)果公平,共測試五次,取平均值。

單位:秒


運(yùn)行次數(shù) VB計算器 VC++計算器
1 2.43 0.87
2 0.85 0.74
3 0.92 0.92
4 1.02 0.78
5 0.87 0.84
平均速度 1.22 0.83

  你會發(fā)現(xiàn),VB計算器第一次比較慢,剩下幾次就快了。這是因為ThunRTMain 把所有控件信息寫入內(nèi)存,每次打開程序時檢測是否有可用控件信息而且符合本程序(大概比爾也知道VB慢吧)。另外,我們只能算加法的計算器啟動速度就和功能眾多的Windows計算器差不多,更可以知道我們?nèi)绻肰B編出一個和Windows計算器功能相同的計算器的啟動速度了。:( VB也不全是缺點,至少它的程序設(shè)計環(huán)境是其它程序語言所不具備或不擅長的。

  像VB這樣簡單易學(xué),可以像畫圖一樣構(gòu)造程序界面的程序語言可以說只有VB 一個,它為編程初學(xué)者指明了方向。VB是有它存在的理由的,至少,我SuperAPI還在用它。:)

  后記:

  寫這篇文章的靈感來自于兩天前VB論壇里cy72提出的問題。昨天半夜沒上網(wǎng),集中精力調(diào)試一個VB程序,終于找出了答案。在DLL里轉(zhuǎn)來轉(zhuǎn)去的感覺真的很難受,加之我對匯編還不太懂。以每秒3條語句的速度進(jìn)行,調(diào)試了49218 步,共用了4個半小時。我自從接觸VB以來從沒感覺過VB程序是這樣復(fù)雜。

  尤其值得一提的是,4個半小時中4個小時是泡在近似無限的循環(huán)中,這種長時間重復(fù)一件枯燥而乏味的事情我可總算是見識到了,各位調(diào)試VB程序時大可不必心煩意亂,你只要想想長時間按著F7、F5鍵,在迎面撲來的一堆堆成山的天書般的匯編語言中尋找有用東西的滋味你就知道調(diào)試VB程序是最簡單的了
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VB、VBA、VBS的區(qū)別你搞清楚了嗎?
VB6反編譯詳解
VB程序破解
全面討論VB.NET申明Windows API函數(shù) - 51CTO.COM
如何打包你的VB軟件(一)
C/C++==編譯型語言(zz)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服