程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VB5.0與Windows API 間的呼叫技巧

VB5.0與Windows API 間的呼叫技巧

編輯:VB綜合教程

  一般會使用WINDOW API的情況,實在是因為VB本身不提供某些功能,但是,程式所需又不得不然,例如:讀取Registry內的資料,VB只提供SaveSetting、Getsetting 等系列的指令,但是它只能讀取特定地區的值,要讀、刪、更動其他區域的值時,就無法使用。再如:仔細看一看Combo Box的Events,其中沒有MouseMove,但這是我們經常用上的一個Event,那該如何呢?是的,那只有透過Winodow API。而VB呼叫Window API一般不都使用API檢視員,直接將相對應的API COPY到我們的程式中就好,那還用什麽技巧嗎?其實不然,因為VB資料格式的問題,又加上VB本身沒有指標,在許多地方需要一些小技巧才能解決,而且我們經常因應不同的需求,將API 檢視員的宣告COPY過來後再做一些修改,最重要的,如果有一個.DLL檔,它不在API 檢視員中定義,那時,就只有自己想辦法啦。

  一、 整數三數

  Windows             API32位元VB

  ==============================  =============================

  Int, INT            ByVal Long

  UNIT, DWORD           ByVal Long

  BOOL               ByVal Long  ture時為1

  WPARAM, LPARAM, LRESULT    ByVal Long

  Handle(如HKEY)          ByVal Long

  WORD, ATOM, SHORT       ByVal Integer

  BYTE, CHAR            ByVal Byte

  Eg.

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

  Windows API 宣告

  SHORT GetKeyState( int nVirtKey )

  對應的VB宣告

  Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

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

  這個API 可用來檢視某些KEY (如Insert鍵、Num Lock、CapsLock等)是on/off。程式如下:這個例子應該可十分楚的看到各個整數間的宣告對應。

  

-----------------------------------------------------------------------------
Dim InsertMode as Integer
InsertMode = GetKeyState(vbKeyInsert) And vbShiftMask
If InsertMode = 1 then
 
        Debug.print "表示 Insert Mode"
Else
 
        Debug.print "表示 OverWrite Mode"
End If
-----------------------------------------------------------------------------

  二、 指向整數的指標

  Windows API          32位元VB

  ============================ ==========================

  LPINT             (ByRef ) Long

  LPUNIT            (ByRef ) Long

  LPBOOL            (ByRef ) Long

  LPDWORD            (ByRef ) Long

  LPHANDLE (如:PHKEY)      (ByRef ) Long

  LPWORD            (ByRef ) Integer

  LPSHORT            (ByRef ) Integer

  LPBYTE            (ByRef ) Byte

  VB內定是使用傳址呼叫,所以ByRef 可以省略,也就是說

  Func(ByRef param1 as type)

  與

  Func(param1 as type)

  是相同的,使用傳址呼叫的方式,不外乎想將三數傳給API 後將結果傳回來。然而LONG型態的傳址呼叫在VB中又占了相當大的份量,因為32位元的指標都是LONG的型態,而字串、自定型態的Structure在Windows API中是以指標來傳遞的,而指標的傳遞事實上也是Long值的傳遞,只不過傳過去的LONG值,於WIN API中會將之當成Address,而再配合指標運作而得指標所指的內容,這個觀念在後面會很重要。

  例如:

  

-----------------------------------------------------------------------------
LONG RegOpenKeyEx(
  
        HKEY    hKey,      // handle of open key
  
        LPCTSTR   lpszSubKey,   // address of name of subkey to open
  
        DWORD    dwReserved,   // reserved
  
        REGSAM   samDesired,   // security access mask
  
        PHKEY    phkResult    // address of handle of open key
  
        );
相對應的VB 宣告
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
    
        (ByVal hKey As Long, _
     
        ByVal lpSubKey As String, _
     
        ByVal ulOptions As Long, _
     
        ByVal samDesired As Long, _
     
        phkResult As Long) As Long  '//最後一個三數是ByRef之宣告
-----------------------------------------------------------------------------

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一頁
  • 尾頁
  • 共6頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved