或 例如: ----------------------------------------------------------------------------- int GetWindowText( HWND hWnd, // handle of window or control with text LPTSTR lpString, // address of buffer for text int nMaxCount // maximum number of characters to copy ); 该 API 取得WINDOW Title Bar的文字,而传回值是放入lpString的character个数。 VB的宣告如下:
Decl are Function GetWindowText Lib "user32" Alias "GetWindowTextA" _ (ByVal hwnd As Long, _ ByVal lpString As String, _ ByVal cch As Long) As Long 范例一 ***************************************************************************** Dim CharCnt As Long Dim lpString As String Dim tmpstr As String Dim NullPos As Long
----------------------------------------------------------------------------- LONG RegQueryValueEx( HKEY hKey, // handle of key to query LPTSTR lpszValueName, // address of name of value to query LPDWORD lpdwReserved, // reserved LPDWORD lpdwType, // address of buffer for value type LPBYTE lpbData, // address of data buffer LPDWORD lpcbData // address of data buffer size ); VB的宣告(由API检视员中Copy下来者) Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _ (ByVal hKey As Long, _ ByVal lpValueName As String, _ ByVal lpReserved As Long, _ lpType As Long, _ lpData As Any, _ lpcbData As Long) As Long ----------------------------------------------------------------------------- 仔细看一下第三个参数,WIN API中是LPDWORD可是VB中麽会是用ByVal的方式传递 呢?原因在於 lpReserved一定要传Null进去,VB在呼叫时便在 这参数的位置上填0(见 范例三)。为何传Null就得这做?我们可以这麽想,我们 在程式中下指令,告诉VB要以 ByVal 的方式传0出去,而WIN API里,它可不管VB是ByVal或ByRef,API 认定我们传 进 来的就是它需要的,所以了,第三个参数在API中认定我们传进的是一个Address,而VB 传0进去,那代表API若去取得它的内容,便会取得Address 0 的内容,或许Window的 Null值便是指向Address 0呢!另一个作法比较直接,将VB宣告的第三个参数宣告由 ByVal lpReserved As Long改成 ByVal lpReserved as String而使用时固定传 vbNullString 进去也可以。这里在一个观念,那就是VB对Win API的宣告,纯粹是给VB 自己看的,在API中定义了一个指标的参数,Api检视员会将之宣告成ByRef的方式(字串 除外),但我们可随需要而更动它,一个原始应为ByRef的参数宣告,我们可以将之改为 ByVal的方式,只要我们能取得参数的位址,而将这型态为Long的位址以ByVal传出去, Win API 端根本不知道VB端是用什麽方式传,反正只要我们传了一Long值进去,Win API 就会以这个Long值当作是Address来运作。
----------------------------------------------------------------------------- Declare Function RegQueryLong Lib "advapi32.dll" Alias "RegQueryValueExA" _ (ByVal hKey As Long, _ ByVal lpValueName As String, _ ByVal lpReserved As Long, _ lpType As Long, _ lpData As Long, _ lpcbData As Long) As Long
Declare Function RegQueryString Lib "advapi32.dll" Alias "RegQueryValueExA" _ (ByVal hKey As Long, _ ByVal lpValueName As String, _ ByVal lpReserved As Long, _ lpType As Long, _ Byval lpData As String, _ lpcbData As Long) As Long ----------------------------------------------------------------------------- 使用两个宣告来解决这个问题,依不同的lpType呼叫不同的函式,即lpType= REG_ DWORD时,呼叫RegQueryLong, lpType = REG_SZ时则为RegQueryString这也可以让我们 了解为何VB API的宣告为什麽要有Alias的存在。
范例三 ***************************************************************************** Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) _ As Long 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 Declare Function RegQueryString Lib "advapi32.dll" Alias _ "RegQueryValueExA" (ByVal hKey As Long, _ ByVal lpValueName As String, ByVal lpReserved As Long, _ lpType As Long, ByVal lpData As String, lpcbData As Long) As Long Const REG_EXPAND_SZ = 2 Const HKEY_CLASSES_ROOT = &H80000000 Const READ_CONTROL = &H20000 Const STANDARD_RIGHTS_READ = (READ_CONTROL) Const KEY_QUERY_VALUE = &H1 Const KEY_ENUMERATE_SUB_KEYS = &H8 Const KEY_NOTIFY = &H10 Const SYNCHRONIZE = &H100000 Const KEY_READ = ((STANDARD_RIGHTS_READ Or _ KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or _ KEY_NOTIFY) And (Not SYNCHRONIZE))
Dim key5 As String, ValueName as String, strBuff&nb