![]() |
未公開保留字 ObjPtr、StrPtr、VarPtr 的介紹及應用 (也就是傳址、指標)
'幾個重要的函數舉例
'ObjPtr:返回對像實例私有域的地址。 'StrPtr:返回字符串第一個字的地址。 'VarPtr:返回變量的地址。 介紹如下 ========= '變量的地址 'VB5 內置了一個 VarPtr 函數,可是此函數在 VB4 中沒有提供。 '其實 VB4 的運行庫中已經包含了此函數。只是在用它之前,我們需要聲明一下: #If Win16 Then Declare Function VarPtr Lib "VB40016.DLL" (variable As Any) As Long #Else Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As Long #End If '此函數在傳遞一個 Type 結構 (如果此結構要求其一段是另一個變量或記錄的地址) '給一個外部的 API 程序時十分有用。 '在msvbvm50.dll或msvbvm60.dll有個函數VarPtrArray 可以取得陣列的指標 '如果用的是VB5 宣告方式是這樣 'Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long '如果用的是VB6 宣告方式是這樣 Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long '其實 VB6 不用宣告也就是 VarPtrArray = 未公開保留字 VarPtr 應用1 ========= Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long) Private Sub EX1() Dim a(100) As Byte Dim b() As Byte Dim ptr1 As Long, ptr2 As Long a(3) = 234 ReDim b(UBound(a)) ptr1 = VarPtr(a(0)) ptr2 = VarPtr(b(0)) CopyMemory ByVal ptr2, ByVal ptr1, UBound(a) Ens sub '執行後 b(3) 之內容也會是 234,也就是 a() = b() ========= 應用2 ========= Public Declare Function CreateThread Lib "kernel32" ( _ lpThreadAttributes As Any, _ ByVal dwStackSize As Long, _ ByVal lpStartAddress As Long, _ ByVal lpParameter As Long, _ ByVal dwCreationFlags As Long, _ lpThreadId As Long) As Long Call CreateThread(Null, ByVal O&, AddressOf Module1.OutText1, VarPtr(0), ByVal 0&, threadid1) '參數一,lpThreadAttributes ,線程安全屬性,傳遞為NULL '參數二,dwStackSize ,線程堆棧大小,可以為0,表示堆棧和此應用堆棧相同 '參數三,lpstartAddress ,執行函數地址,用AddressOf 獲取 '參數四,lpParameter ,執行函數的參數地址,可以是一個記錄或者是別的類型,用VarPtr獲取參數地址(varptr為未公開函數)!! '參數五,dwCreationFlags ,表示線程創建後的狀態!,0表示立即運行,create_SUSPENDED表示線程掛起 '參數六,lpThreadID ,表示分配給線程的線程號 可看到 VarPtr(0),因為沒要傳入參數所以填 VarPtr(0) 亦可填直接填 0 解說: Module1.OutText1 是一個宣告的執行序函數 如果其原形是 Sub OutText1(ParamArray ArrayValue()) ..... End sub 那就可以這麼用 Parameter(0) = a Parameter(1) = b Call CreateThread(Null, ByVal O&, AddressOf Module1.OutText1, VarPtr(Parameter(0)), ByVal 0&, threadid1) '這個自己沒時間試有興趣的版友可以試試 |
所有時間均為台北時間。現在的時間是 04:57 PM。 |
Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.
『服務條款』
* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *