怎樣手工宣告API (轉)
怎樣手工宣告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 關鍵字。
字串引數是一個特例。如果以使用值方式傳遞字串,那麼傳遞的將是該字串中第一個資料位元組的地址;如果以使用引用方式傳遞字串,那麼實際傳遞的將是用來儲存另一個地址的記憶體單元的地址;後面的“地址”實際是字串的第一個資料位元組的記憶體地址。
--------------------------------------------------------------------------------
??儘管 在 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VB中API的宣告特殊問題 (轉)API
- API的宣告性力量API
- java 宣告物件(轉)Java物件
- 轉行學IT怎麼樣?
- 怎樣打敗微軟 (轉)微軟
- 怎樣捕捉 Delete 鍵 (轉)delete
- 怎樣讓程式延時 (轉)
- Oracle 9 手工建庫(轉)Oracle
- [探索]怎樣讓 JS - API 具有更好的實用性JSAPI
- 語音轉文字工具,語音轉文字怎樣轉?
- 【轉】怎樣修改Oracle的SIDOracle
- 怎樣用程式取得CPU資訊 (轉)
- 怎樣做專案計劃(轉)
- 怎樣建立專案預算(轉)
- 在網頁中怎樣使文字旋轉? (轉)網頁
- 字串:怎樣轉換字串為數字型別? (轉)字串型別
- 手工建立oracle資料庫(轉)Oracle資料庫
- freebsd手工配置網路(轉)
- 轉行學Java開發怎麼樣?Java
- 怎麼樣轉換pdf格式為Word?
- 【CDB】怎樣轉換non-CDB to CDB
- 怎樣遮蔽掉開始按鈕? (轉)
- 怎樣使用ASP實現Ping (轉)
- 怎樣讓 Windows 98 更穩定(轉)Windows
- MySQL怎樣最佳化WHERE子句(轉)MySql
- 怎樣當施工專案經理(轉)
- 轉向vscode的宣告VSCode
- 怎麼樣把本地的java原始檔,資源等提交到web伺服器,不是手工。JavaWeb伺服器
- excel日期格式轉換中,怎樣將“/”轉換成“-”Excel
- 字串:怎樣將數字型別轉換為字串 (轉)字串型別
- java變數怎麼設定(宣告)Java變數
- 怎樣透過模型讓 Filament Table 消費外部 API 資料模型API
- 字串: 怎樣在ANSI 和 UNICODE間做轉換 (轉)字串Unicode
- Caj檔案怎樣整篇轉換成Word
- 數字化轉型流程是怎樣的?
- 怎樣玩轉千萬級別的資料
- 在Oracle中怎樣才能使用索引(轉)Oracle索引
- 怎 樣 在APPLET 中 發EMAIL (轉)APPAI