史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-07-05, 02:26 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9894小時 | 升級還需:102小時級別:97 | 在線時長:9894小時 | 升級還需:102小時級別:97 | 在線時長:9894小時 | 升級還需:102小時級別:97 | 在線時長:9894小時 | 升級還需:102小時級別:97 | 在線時長:9894小時 | 升級還需:102小時級別:97 | 在線時長:9894小時 | 升級還需:102小時級別:97 | 在線時長:9894小時 | 升級還需:102小時
註冊日期: 2002-12-07
文章: 13359
精華: 0
現金: 26484 金幣
資產: 3024394 金幣
預設 未公開保留字 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)

'這個自己沒時間試有興趣的版友可以試試
mini 目前線上  
送花文章: 2016, 收花文章: 8010 篇, 收花: 26819 次
回覆時引用此帖
向 mini 送花的會員:
羅迪 (2009-09-09)
感謝您發表一篇好文章
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 10:09 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1