'========名稱GS_Interface.dll===如何申明及呼叫里面的函式=====
File Type: DLL
Section contains the following exports for GS_Interface.dll
0 characteristics
0 time date stamp Thu Jan 01 08:00:00 1970
0.00 version
1 ordinal base
18 number of functions
18 number of names
ordinal hint RVA name
8 0 001477D4 BatchFeeDetail_H
2 1 00147810 CallManInfo
1 2 00147A60 CallManList
18 3 001476D0 CheckNet
5 4 001477E8 ChgFacAndBed
16 5 001476EC DelDetail_M
10 6 001477AC DelFeeDetail_H
3 7 00147754 DelRegister
9 8 001477C0 FeeDetail_H
15 9 00147700 FeeDetail_M
17 A 001476D8 ManRegister_M
11 B 00147740 ManRegister_Z
13 C 0014772C OutCurtain_M
6 D 0014777C OutFeeCurtain
7 E 00147794 PreCurtain_H
14 F 00147714 PreCurtain_M
4 10 001477FC RtnCurtain
12 11 00147768 RtnTicket
Summary
1000 .adata
2000 .aspack
1000 .edata
3000 .idata
15000 .reloc
1A000 .rsrc
2000 BSS
148000 CODE
4000 DATA
’============================
uj5u.com熱心網友回復:
宣告 DLL 程序盡管 Visual Basic 在 Win32api.txt 中提供了大量的預定義宣告,但還是需要知道如何親自撰寫宣告。例如,有時希望訪問用其它語言撰寫的 DLL 中的程序,或者改寫 Visual Basic 的預定義宣告,以滿足特殊需要。
要宣告一個 DLL 程序,需要在代碼視窗的“宣告”部分增加一個 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]]...])]
預設情況下,在標準模塊中宣告的 DLL 程序是公有的,可以在應用程式的任何地方呼叫它。在其它型別的模塊中定義的 DLL 程序是模塊私有的,必須在它們前面宣告 Private 關鍵字,以示區分。
在 32 位的 Visual Basic 中程序名是區分大小寫的。在以前的 16 位版本中,程序名是不區分大小寫的。
詳細資訊 請參閱《聯機手冊》中《語言參考》中的“宣告陳述句”。
指定庫
Declare 陳述句中的 Lib 子句用來告訴 Visual Basic 如何找到包含程序的 .dll 檔案。如果參考的程序屬于 Windows 核心庫(User32、Kernel32 或 GDI32),則可以不包含檔案擴展名:
Declare Function GetTickCount Lib "kernel32" Alias _
"GetTickCount" () As Long
對于其它 DLL,Lib 子句指定檔案的路徑:
Declare Function lzCopy Lib "c:\windows\lzexpand.dll" _
(ByVal S As Integer, ByVal D As Integer) As Long
如果未指定 libname 的路徑,Visual Basic 將按照下列順序查找該檔案:
.exe 檔案所在的目錄
當前目錄
Windows 位系統目錄(通常為 \Windows\System)
Windows 目錄(不一定是 \Windows)
Path 環境變數中的目錄
下表中列出了通常的作業系統環境庫檔案。
元件 描述
Advapi32.dll 高級 API 服務,支持大量的 API(其中包括許多安全與注冊方面的呼叫)
Comdlg32.dll 通用對話框 API 庫
Gdi32.dll 圖形設備介面 API 庫
Kernel32.dll Windows 32 位核心的 API 支持
Lz32.dll 32 位壓縮例程
Mpr.dll 多介面路由器庫
Netapi32.dll 32 位網路 API 庫
Shell32.dll 32 位 Shell API 庫
User32.dll 用戶介面例程庫
Version.dll 版本庫
Winmm.dll 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 關鍵字,但是如果包含該關鍵字,就能夠清楚地看出資料是以何種方式傳遞的。
許多 DLL 程序要求引數以值方式傳遞。這意味著它們需要實際的資料,而不是資料的記憶體地址。如果程序需要一個傳值引數,而傳遞給它的引數是一個指標,那么由于得到了錯誤的資料,該程序將不能正確地作業。
要使引數以使用值方式傳遞,在 Declare 陳述句中需要在引數宣告的前面加上 ByVal 關鍵字。例如,InvertRect 程序要求第一個引數使用值,而第二個使用參考:
Declare Function InvertRect Lib "user32" Alias _
"InvertRectA" (ByVal hdc As Long, _
lpRect As RECT) As Long
也可以在呼叫程序時使用 ByVal 關鍵字。
注意 在查看使用 C 語言語法的 DLL 程序檔案時,請記住 C 以傳值方式傳遞陣列以外的引數。
字串引數是一個特例。如果以使用值方式傳遞字串,那么傳遞的將是該字串中第一個資料位元組的地址;如果以使用參考方式傳遞字串,那么實際傳遞的將是用來保存另一個地址的記憶體單元的地址;后面的“地址”實際是字串的第一個資料位元組的記憶體地址。本章后面的幫助主題“將字串傳遞到 DLL 程序”將解釋如何確定字串引數傳遞的正確方式。
不標準的名稱
有時,個別的 DLL 程序的名稱不是有效的識別符號。例如,它可能包含了非法的字符(如連字符),或者名稱是 Visual Basic 的關鍵字(如 GetObject)。在這種情況下,可以使用 Alias 關鍵字。
例如,操作環境 DLL 中的某些程序名以下劃線開始。盡管在 Visual Basic 識別符號中允許使用下劃線,但是下劃線不能作為識別符號的第一個字符。為了使用這種程序,必須先宣告一個名稱合法的程序,然后用 Alias 子句參考程序的真實名稱:
Declare Function lopen Lib "kernel32" Alias "_lopen" _
(ByVal lpPathName As String, ByVal iReadWrite _
As Long) As Long
在上例中,lopen 是 Visual Basic 中使用的程序名稱。而 _lopen 則是 DLL 中可以識別的名稱。
為了使用方便,也可以使用 Alias 子句改變程序的名字。如果使用自己的名稱替代了程序原來的名稱(例如使用 WinDir 代替 GetWindowsDirectoryA),那么必須在檔案中清楚地說明這種修改,從而便于將來對檔案進行維護。
使用序號標識 DLL 程序
除了使用名稱之外,還可以使用序號來標識所有 DLL 程序。某些 DLL 中不包含程序的名稱,在宣告它們包含的程序時必須使用序號。同使用名稱標識 DLL 程序相比,如果使用序號,在最終的應用程式中消耗的記憶體將比較少,而且速度會快些。
重點 一個具體的 API 的序號在不同的作業系統中可能是不同的。例如 GetWindowsDirectory 在 Win95 下的序號為 432,而在 Windows NT 4.0 下為 338。總而言之,如果希望應用程式能夠在不同的作業系統下運行,那么請不要使用序號來標識 API 程序。如果程序不屬于 API,或者應用程式使用的范圍很有限,那么使用序號還是有好處的。
要使用序號來宣告 DLL 程序,Alias 子句中的字串需要包含程序的序號,并在序號的前面加一個數字標記字符 (#)。例如,Windows kernel 中的 GetWindowsDirectory 函式的序號為 432;可以用下面的陳述句來宣告該 DLL 程序:
Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "#432" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
注意,這里可以使用任意的合法名稱作為程序的名稱,Visual Basic 將用序號在 DLL 中尋找程序。
為了得到要宣告的程序的序號,可以使用 Dumpbin.exe 等實用工具。(Dumpbin.exe 是 Microsoft Visual C++ 提供的一個實用工具。)利用 Dumpbin,可以提取出 .dll 檔案中的各種資訊,例如 DLL 中的函式串列,它們的序號以及與代碼有關的其它資訊。
詳細資訊 關于運行 Dumpbin 實用程式的有關說明,請參閱 Microsoft Visual C++ 檔案。
靈活的引數型別
某些 DLL 程序的同一個引數能夠接受多種資料型別。如果需要傳遞多種型別的資料,可以將引數宣告為 As Any,從而取消型別限制。
例如,根據需要,下面的宣告中的第三個引數 (lppt As Any) 既可以傳遞一個 POINT 結構的陣列,也可以傳遞一個 RECT 結構:
Declare Function MapWindowPoints Lib "user32" Alias _
"MapWindowPoints" (ByVal hwndFrom As Long, _
ByVal hwndTo As Long, lppt As Any, _
ByVal cPoints As Long) As Long
As Any 子句提供了一定的靈活性,但是,由于它不進行任何的型別檢查,風險也隨之增加。如果不進行型別檢查,那么在呼叫程序時用錯型別的可能性增加,這可能導致各種問題,包括應用程式的失敗。在使用 As Any 子句時,必須仔細檢查所有引數的型別。
在消除了型別限制以后,Visual Basic 假定引數以傳參考方式傳遞。在實際呼叫程序時,如果要使用傳值方式,可以加入 ByVal。字串將以傳值方式傳遞,因此傳遞的是指向字串的指標,而不是指向指標的指標。更深入的討論請參閱“將字串傳遞到 DLL 程序”。
uj5u.com熱心網友回復:
將 C 語言宣告轉換為 Visual Basic 宣告在檔案中,通常使用 C 語言的語法描述 DLL 中的程序。要在 Visual Basic 中呼叫這些程序,需要將它們轉換成合法的 Declare 陳述句,并使用正確的引數呼叫它們。
在進行這種轉換時,必須將 C 資料型別轉換為 Visual Basic 的資料型別,并且說明每個引數是以使用值的 (ByVal) 方式,還是使用參考的 (ByRef)(預設)方式。下表針對常用的 C 語言資料型別列出了與之等價的 Visual Basic 型別(用于 32 位版本的 Windows)。
C 語言資料型別 在 Visual Basic 中宣告為 呼叫時使用的運算式
ATOM ByVal variable As Integer 結果為 Integer 型別的運算式
BOOL ByVal variable As Long 結果為 Long 型別的運算式
BYTE ByVal variable As Byte 結果為 Byte 型別的運算式
CHAR ByVal variable As Byte 結果為 Byte 型別的運算式
COLORREF ByVal variable As Long 結果為 Long 型別的運算式
DWORD ByVal variable As Long 結果為 Long 型別的運算式
HWND, HDC, HMENU 等。(Windows 句柄) ByVal variable As Long 結果為 Long 型別的運算式
INT, UINT ByVal variable As Long 結果為 Long 型別的運算式
LONG ByVal variable As Long 結果為 Long 型別的運算式
LPARAM ByVal variable As Long 結果為 Long 型別的運算式
LPDWORD variable As Long 結果為 Long 型別的運算式
LPINT, LPUINT variable As Long 結果為 Long 型別的運算式
LPRECT variable As type 自定義型別的任意變數
LPSTR, LPCSTR ByVal variable As String 結果為 String 型別的運算式
LPVOID variable As Any 任何變數(在傳遞字串的時候使用 ByVal)
LPWORD variable As Integer 結果為 Integer 型別的運算式
LRESULT ByVal variable As Long 結果為 Long 型別的運算式
NULL As Any 或
ByVal variable As Long ByVal Nothing 或 ByVal 0& 或 vbNullString
SHORT ByVal variable As Integer 結果為 Integer 型別的運算式
VOID Sub procedure 不可用
WORD ByVal variable As Integer 結果為 Integer 型別的運算式
WPARAM ByVal variable As Long 結果為 Long 型別的運算式
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/123899.html
標籤:API
上一篇:求演算法!比較難!急!
