怎樣手工宣告API (轉)

worldblog發表於2007-12-04
怎樣手工宣告API (轉)[@more@]怎樣手工宣告     轉自: VB愛好者樂園

--------------------------------------------------------------------------------

??儘管 在 api.txt 中提供了大量的預定義宣告,但還是需要知道如何親自編寫宣告。例如,有時希望訪問用其它語言編寫的 DLL 中的過程,或者改寫 Visual Basic 的預定義宣告,以滿足特殊需要。
  要宣告一個 API 過程,需要在程式碼視窗的“宣告”部分增加一個 Declare 語句。如果該過程返回一個值,應將其宣告為 Function:

Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

  如果過程沒有返回值,可將其宣告為 Sub:

Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]

  預設情況下,在標準模組中宣告的 API 過程是公有的,可以在應用的任何地方它。在其它型別的模組中定義的 API 過程是模組私有的,必須在它們前面宣告 Private 關鍵字,以示區分。

 

  一.指定庫

  Declare 語句中的 Lib 子句用來告訴 Visual Basic 如何找到包含過程的 .API 。如果引用的過程屬於 核心庫(User32、Kernel32 或 GDI32),則可以不包含副檔名:

Declare Function GetTickCount Lib "kernel32" Alias _
"GetTickCount" () As Long
  對於其它 DLL,Lib 子句指定檔案的路徑:

Declare Function lzCopy Lib "c:windowslzexpand.API" _
(ByVal S As Integer, ByVal D As Integer) As Long
  如果未指定 libname 的路徑,Visual Basic 將按照下列順序查詢該檔案:

.exe 檔案所在的目錄


當前目錄


Windows 位目錄(通常為 WindowsSystem)


Windows 目錄(不一定是 Windows)


Path 環境變數中的目錄

 二.處理使用字串的 Windows API 過程

  如果呼叫的 Windows API 過程要使用字串,那麼宣告語句中必須增加一個 Alias 子句,以指定正確的字符集。包含字串的 Windows API 實際有兩種格式:ANSI 和 Unicode。因此,在 Windows 標頭檔案中,每個包含字串的函式都同時有 ANSI 版本和 Unicode 版本。
  例如,下面是 SetWindowText 函式的兩種 C 語言描述。可以看到,第一個描述將函式定義為 SetWindowTextA,尾部的“A”表明它是一個 ANSI 函式:

WINUSERAPI
BOOL
WINAPI
SetWindowTextA(
HWND hWnd,
LPCSTR lpString);

  第二個描述將它定義為 SetWindowTextW,尾部的“W”表明它是一個 Unicode 函式:

WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
HWND hWnd,
LPCWSTR lpString);

  因為兩個函式實際的名稱都不是“SetWindowText”,要引用正確的函式就必須增加一個 Alias 子句:

Private Declare Function SetWindowText Lib "user32" _
Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal _
lpString As String) As Long

  請注意,Alias 子句後面的字串必須是過程的真正名稱,而且必須是區分大小寫的。
  對於 Visual Basic 中使用的 API 函式,應該指定函式的 ANSI 版本,因為只有 才支援 Unicode 版本,而 Windows 95 不支援這個版本。僅當應用程式只執行在 Windows NT 平臺上的時候才可以使用 Unicode 版本。

 

  三.使用值或引用傳遞

  在預設的情況下,Visual Basic 以引用方式傳遞所有引數。這意味著並沒有傳遞實際的引數值,Visual Basic 只傳遞了資料的 32 位地址。在 Declare 語句中不要求包含 ByRef 關鍵字,但是如果包含該關鍵字,就能夠清楚地看出資料是以何種方式傳遞的。
  許多 API 過程要求引數以值方式傳遞。這意味著它們需要實際的資料,而不是資料的地址。如果過程需要一個傳值引數,而傳遞給它的引數是一個指標,那麼由於得到了錯誤的資料,該過程將不能正確地工作。
  要使引數以使用值方式傳遞,在 Declare 語句中需要在引數宣告的前面加上 ByVal 關鍵字。例如,InvertRect 過程要求第一個引數使用值,而第二個使用引用:

Declare Function InvertRect Lib "user32" Alias _
"InvertRectA" (ByVal hdc As Long, _
lpRect As RECT) As Long

  也可以在呼叫過程時使用 ByVal 關鍵字。
  字串引數是一個特例。如果以使用值方式傳遞字串,那麼傳遞的將是該字串中第一個資料位元組的地址;如果以使用引用方式傳遞字串,那麼實際傳遞的將是用來儲存另一個地址的記憶體單元的地址;後面的“地址”實際是字串的第一個資料位元組的記憶體地址。  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988245/,如需轉載,請註明出處,否則將追究法律責任。

相關文章