VB無所不能之一:指標

來源:互聯網
上載者:User
本文地址:http://blog.csdn.net/useway 《Java程式員,上班那點事兒》 ——作者:鐘聲

卷首語:    無數次的見到有人一談到VB都會顯露出不屑的神情。    VB一個軟體開發領域的老朋友,它曾經以開發便捷與簡單著稱,它在一定時間內成為一個非常常用的開發語言。    然而,當很多人享受這VB帶來的便捷的同時,還在嘲諷這個VB,總是用VC的種種所謂的優勢來和VB對比。讓我想起了今天的Java,當那些享受著Java帶來的輕鬆的人,卻還在用C/C++嘲諷著Java是一樣的。    VB它的優勢豈能由VC企及,不說別的,只說VB的開發速度VC基本上是望塵莫及的。傳統上,VC相對與VB而言有很多的優勢:     1、指標:這個似乎是打擊所有沒有指標的語言(如:java)的利器。    2、原始IP包的擷取:用混雜模式擷取IP資料報資訊,C++中稱為原始IP包。    3、系統訊息鉤子:用鉤子程式擷取Windows系統訊息。    4、利用靜態連結實現軟體的綠化:同時也便於產生一個病毒或者木馬程式。    5、和硬體相關的開發,如顯示器、音效卡、網卡等。 本系列連載,將針對上述5個問題來討論,VB實現的可能性。  一、為什麼VB要用指標:     C/C++中都可以操作指標,用指標可以很方便的訪問到記憶體地區,C++中的指標其實就是數組的一個訪問方式而已,由於其使用比較方便,可以非常方便的進行對記憶體地區的賦值與讀取操作,因此,用慣了C++的程式員樂此不疲。    其實,我們在用VB開發一般程式的時候是沒有必要用指標去訪問記憶體某地區的。因為VB為我們提供了一個非常方便的存取方法——就是VB的數組。用數組可以很方便的使用一組資料。然而,為什麼,在VB中我們非要去實現指標的操作呢?       1、資料操作速度的需求     比如,需要針對兩個數組之間的複製操作,需要給數組做一個迴圈,然後在逐個的添加到新的數組中,用指標的方法速度會快很多。       2、在對系統庫函數的調用時     Windows中的User32.dll/GDI32.dll/Kernel32.dll等這些系統庫函數中,很多都是接收指標參數的,因此,如果VB需要調用這些函數的時候,就必須要進行指標的傳參。  二、VB怎麼用指標     要想弄明白VB怎麼使用指標,就必須要弄明白兩件事,第一,如何取得數組的指標,第二,如何將指標所指向的數組取出來。      A、在講解這兩個問題之前,我們需要瞭解幾個問題:      1、VB的數組與C++的數組的區別    有可能,大家現在認為VB的數組和C++的數組沒有任何區別,都是記憶體中的一段地址而已,其實不然。    C++中是真的數組,真的是一段地址,而且,當你的指標訪問超出了數組的範圍,也沒人理你,只是很容易導致系統崩潰而已。    而VB數組其實是一個結構體,在這個結構體中包含了關於這個數組的描述資訊,其結構類似如下: Private Type VB數組   數組維數   數組大小
   真實的數組
End Type       2、Copymemory系統函數     這個函數有點像Java中的ArrayCopy函數,就是將兩段記憶體空間進行複製操作。它的聲明是這樣的:Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)   函數原型   VOID CopyMemory(
  PVOID Destination,
  CONST VOID *Source,
  DWORD Length
  );         第一個參數:目的地址指標        第二個參數:源地址指標        第三個參數:複製的大小         請注意,在CopyMemory的VB聲明中,傳遞的源與目的是Any類型,也就是說可以是任何類型的變數。      B、如何用指標      1、如何取得數組的指標     請看如下程式:    pOutputArray As Long
    outputArray() As Byte    ReDim outputArray(100) As Byte
    pOutputArray = VarPtr(outputArray(0))     說明:    我們聲明了一個Byte數組outputArray,用VarPtr函數,取出數組的指標賦給了Long型變數pOutputArray。      2、如何將指標所指向的數組取出來     請看如下程式:    CopyMemory ByVal pOutputArray, ByVal pData, UBound(outputArray)     說明:    pData是一個記憶體塊的指標,通過這句話的執行,我們得到了pData指向的記憶體地區中的資料到pOutputArray數組中。  三、進階應用程式:取得函數的指標     有時候,系統函數庫調用中會要求有回呼函數,而將回呼函數以參數進行傳遞時,並不能傳入回呼函數名,而是需要將回呼函數的地址傳參,這時候,我們就需要得到回呼函數的地址。    在這裡我只給出例子代碼,有興趣的朋友可以去研究。 Public Sub RegisterWinProc(ByVal hwnd As Long)    '傳入hWnd是本視窗的控制代碼
    'GetWindowLong從指定視窗的結構中取得資訊
    prevWndProc = GetWindowLong(hwnd, GWL_WNDPROC)
    'SetWindowLong在視窗結構中為指定的視窗設定資訊
    SetWindowLong hwnd, GWL_WNDPROC, AddressOf WndProc
    DesthWnd = hwnd
End Sub  四、結束語     大家看,VB在處理指標的時候,只要掌握了相應的方法,是不是VC在這時候也就黯然失色了呢?  鐘聲2009-7-6

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.