2.传回後,去除传回值中多馀的字元。
或 例如: ----------------------------------------------------------------------------- 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
Form1.Caption = "这是一个test" lpString = String(255, 0) '设定初值 CharCnt = GetWindowText(Me.hwnd, lpString, 256) 'CharCnt = 12 tmpstr = Left(lpString, CharCnt) '如此做会有一些问题 Debug.Print Len(tmpstr) '得12 Label1.Caption = Left(lpString, CharCnt) Debug.Print Len(Label1.Caption) '得8 *****************************************************************************
以范例一的例子来看,设定lpString= String(255,0)的目的,是设定255个字元的 空间给 lpString(加上最後的null一共256),CharCnt的值是12,明眼者可看到len("这 是一个test") 会是8,但CharCnt是12, 所以直接使用Left()函数来取得子字串会有问 题,这是UniCode与ANSI String间的关系,所以了,当您看到有些书的范例用这种方法 取子字串,是不太完善的,所以改用范例二的方式,比较正确。
范例二 ***************************************************************************** Form1.Caption = "这是一个test" lpString = String(255, 0) '设定初值 CharCnt = GetWindowText(Me.hwnd, lpString, 256) 'CharCnt = 12 NullPos = InStr(1, lpString, Chr(0), vbBinaryCompare) tmpstr = Left(lpString, NullPos - 1) lable1.Caption = tmpstr ***************************************************************************** 四、 Null 值的传递
我们再回到求ProductId的问题,我们已知使用RegOpenKeyEx()来取得subkey的Han dle值,紧接着便是用RegQueryValueEx()来取值。
----------------------------------------------------------------------------- LONG RegQueryValueEx( HKEY hKey, // handle of key to query LPTSTR lpszValueName, // address of name of value to query LPDWORD lpdwReserved, // reserve上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页
|