跳到內容

Visual Basic/Windows API

來自華夏公益教科書,自由的教學內容

API,即“應用程式程式設計介面”,允許您訪問作業系統或其他應用程式(DLL)公開的大量函式和方法,執行 Visual Basic 提供的標準虛擬機器通常未實現的操作。這包括諸如關閉計算機或列出所有當前正在執行的程序的操作。

雖然 VB6 編譯器無法建立真正的 DLL,但它具有呼叫現有 DLL 的功能(當然不僅僅是 Windows API)。此類函式的宣告包含額外的關鍵字 **declare** 和 **lib**,另外可以選擇定義一個別名,如果函式的實際名稱與 dll 函式的名稱不同,則使用 **alias**。例如,它可以是

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)

對於資料型別 **Any**,編譯器接受提供的任何引數。對於 API 呼叫的有效使用,**VarPtr** 運算子非常重要,它返回指定變數的指標;**AddressOf** 運算子對於回撥函式非常重要。初學者經常會在宣告中遺漏或錯誤地指定 ByRef/Byval。簡單地說,**ByVal** 表示將值推送到堆疊上,而 **ByRef**(或缺少呼叫約定的規範)表示將變數的指標推送到堆疊上。在實踐中,引數型別 Long(4 位元組)將被呼叫 ByVal,但 String 或複雜資料型別將被呼叫 ByRef。

不幸的是,VB6 不支援類似 C 的記憶體處理。為了解決這個問題,VB 程式設計師使用 CopyMemory 函式來複制記憶體,如下所示

Dim a As Long
Dim b() As Byte
ReDim b(3)
CopyMemory ByVal varptr(a), ByVal varptr(b), 4

這相對安全。一些知識水平較高的程式設計師也可以修改物件的指標。雖然大多數 API 函式都可以透過這種方式呼叫,但對於一般情況,無法動態呼叫 dll 的入口點(LoadLibrary-GetEntryPoint-FreeLibrary)。處理此類任務的更清晰的方法是將此類程式碼移至用 C++ 編寫的獨立 dll 中,並呼叫該 dll。

宣告的示例是 GetTickCount 函式,它返回自 Windows 啟動以來經過的毫秒數。要使用它,請將以下內容插入專案中的標準模組

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long

要訪問它,只需像呼叫任何普通函式一樣呼叫它。但是請注意,這是一個 *Public* 宣告,並且僅限於模組。如果您不需要它在整個專案中可訪問,請使用 *Private* 宣告,並將其直接插入類模組或窗體中

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

對於初學者來說,建立宣告語句通常很困難,因為它需要知道如何將 C 資料型別對映到 Visual Basic 資料型別。VB6 附帶了一個內建程式,稱為 API 文字檢視器,它列出了所有常用的 API 函式、常量和型別。VB 程式設計師只需從該程式中找到所需的函式,並將其插入 VB 模組中。


上一頁:資料庫 目錄 下一頁:子類化
華夏公益教科書