六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

如何手工聲明API

[摘要]盡管 Visual Basic 在 Win32api.txt 中提供了大量的預定義聲明,但還是需要知道如何親自編寫聲明。例如,有時希望訪問用其它語言編寫的 DLL 中的過程,或者改寫 Visual Basic 的預定義聲明,以滿足特殊需要。  要聲明一個 API 過程,需要在代碼窗口的“聲明”部分...
盡管 Visual Basic 在 Win32api.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 文件。如果引用的過程屬于 Windows 核心庫(User32、Kernel32 或 GDI32),則可以不包含文件擴展名:

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

Declare Function lzCopy Lib "c:\windows\lzexpand.API" _
(ByVal S As Integer, ByVal D As Integer) As Long
  如果未指定 libname 的路徑,Visual Basic 將按照下列順序查找該文件:

.exe 文件所在的目錄


當前目錄


Windows 位系統目錄(通常為 \Windows\System)


Windows 目錄(不一定是 \Windows)


Path 環境變量中的目錄


下表中列出了通常的操作系統環境庫文件。
動態鏈接庫 描述
Advapi32.API 高級 API 服務,支持大量的 API(其中包括許多安全與注冊方面的調用)
Comdlg32.API 通用對話框 API 庫
Gdi32.API 圖形設備接口 API 庫
Kernel32.API Windows 32 位核心的 API 支持
Lz32.API 32 位壓縮例程
Mpr.API 多接口路由器庫
Netapi32.API 32 位網絡 API 庫
Shell32.API 32 位 Shell API 庫
User32.API 用戶接口例程庫
Version.API 版本庫
Winmm.API Windows 多媒體庫
Winspool.drv 后臺打印接口,包含后臺打印 API 調用。


  二.處理使用字符串的 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 版本,因為只有 Windows NT 才支持 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 關鍵字。
  字符串參數是一個特例。如果以使用值方式傳遞字符串,那么傳遞的將是該字符串中第一個數據字節的地址;如果以使用引用方式傳遞字符串,那么實際傳遞的將是用來保存另一個地址的內存單元的地址;后面的“地址”實際是字符串的第一個數據字節的內存地址。


主站蜘蛛池模板: 亚洲一区综合在线播放 | 午夜日韩久久影院 | 亚洲天堂资源网 | 四虎精品永久在线网址 | 亚洲福利 | 日韩欧美国产综合 | 五月婷婷深深爱 | 色噜噜噜噜色 | 在线人成精品免费视频 | 亚洲国产乱码在线精品 | 日韩福利在线 | 四虎影视在永久在线观看 2019 | 欧美在线观看一区二区三区 | 日本道综合一本久久久88 | 中文字幕在线精品视频入口一区 | 日本永久视频 | 亚洲精品高清在线观看 | 天天影视综合色 | 伊人免费在线 | 在线亚洲精品国产成人二区 | 午夜无遮挡怕怕怕免费视频 | 青青草原免费在线 | 日韩一区精品 | 青草成人 | 日韩视频二区 | 亚洲精品在线播放 | 一级一级女人真片 | 天天五月天丁香婷婷深爱综合 | 日本在线观看视频 | 日韩爱爱片| 青娱乐精品视频在线观看 | 最新国语自产精品视频在 | 日韩一级片免费观看 | 在线视频亚洲一区 | 天天拍夜夜添久久精品免费 | 亚洲美女色在线欧洲美女 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片16 | 日韩一区二区三区四区不卡 | 天天干天天操天天做 | 亚洲影视一区 | 青草国产 |