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 as String, ResultStr as String Dim leng1 As Long, resul As Long, hkey As Long Dim tp As Long, i As Long
key5 = " SOFTWARE\Microsoft\Windows\CurrentVerson " resul = RegOpenKeyEx(HKEY_CLASSES_ROOT, key5, 0, KEY_READ, hkey) 'hkey便是subkey (key5)的KeyHandle,先取得它才能存取Subkey内的ValueName ValueName= "ProDuctId " tp = REG_SZ strBuff = String(255, 0) leng1 = Len(strBuff) + 1 resul = RegQueryString(hkey, ValueName, 0, tp, strBuff, leng1) '注意,第三个叁数传0,leng1传回copy 到strBuff的字元个数(anci) leng1 = InStr(1, strBuff, Chr(0), vbBinaryCompare) '重新算个数(UniCode) ResultStr = Left(StrBuff,leng1-1) '这便是ProductId的值 ***************************************************************************** 在这里有另外一件事要特别说明,范例三程式中有一行leng1=Len(strBuffer)+1, 这行可省不得,很奇怪吧,为什麽明明是一个传回值,却一定要设定给它一个strBuff 的大小呢?这是因为许多WIN API 不会聪明到找strBuff的Null Char在哪里,所以需要 程式传进去,而後它再依这个栏位传回填入strBuff 的数目。
五、Array叁数的传递
我们知道Win API 的阵列传递是传阵列的起始位址,所以了,在VB中唯一要注意的 是起始位置的写法。以另一个取得Window目录所在路径的API为 例: ----------------------------------------------------------------------------- UINT GetWindowsDirectory( LPTSTR lpBuffer, // address of buffer for Windows director上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页
|