dim sBuffer(5) as byte , iShukaqiBH as long ,i as long
for i=0 to 4
sBuffer(i)=0
next i
iShukaqiBH =1
Call CopyMemory(sBuffer(1), iShukaqiBH, 2)
CopyMemory函式執行完后,sBuffer(1)應該等于1 ,而現在的結果是等5,請問是怎么回事。
uj5u.com熱心網友回復:
你的 CopyMemory 宣告有差異,建議裝個 ApiViewer 工具Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
uj5u.com熱心網友回復:
非常感謝
1、當宣告為:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)時 sBuffer(1)結果為5 是錯誤的
2、當宣告為:Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) 時 sBuffer(1)結果為1 是正確的
請問,這到底是為什么呢,謝謝。還有為什么這一個函式可以有多個宣告方式呢,得到的結果還不一樣?
uj5u.com熱心網友回復:
CopyMemory 是一個比較特殊的函式,原型中是用 Void 指標來適應任意的資料結構。正因為原型的任意性,VB 中可以通過宣告中引數的變化來對應具體的資料結構。
如果宣告和應用不匹配。輕則出錯,重則崩潰。
要用好API,不僅基礎知識要好,語言也要很精深。
uj5u.com熱心網友回復:
謝謝Tiger_Zhao ,但是還是要麻煩再問一下:因為VB6 中默認是使用 ByRef 來傳遞引數,所以
宣告1、:Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
宣告2、:Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
兩個宣告實際上應該是完全一下的呀,為什么結果會有兩個呢?
uj5u.com熱心網友回復:
在我這里兩個宣告的運行結果是一樣的!主要差別是宣告1中 LibName 沒有后綴 .dll,可能系統環境有關。64位系統?
uj5u.com熱心網友回復:
不是,是32位XP
uj5u.com熱心網友回復:
不過這能有什么區別嗎?
uj5u.com熱心網友回復:
我這里沒區別。你那里偏偏有區別,有什么庫叫 kernel32。病毒?外掛?
uj5u.com熱心網友回復:
kernel32.dll 這不是一個系統檔案嗎,呼叫這個COPYMEMORY函式時,不從kernel32.dll中呼叫,還能到其他的檔案比如kernel32.ccc中呼叫嗎,不可能吧
uj5u.com熱心網友回復:
剛又試了一下:(宣告1中 加 上 ".dll")Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
得到的結果還是結果還是5
uj5u.com熱心網友回復:
只能從環境上找問題咯。斷網。
關各種反病毒、反木馬工具。
關各種界面美化、翻譯工具。
關各種程式。
VB-IDE 中取消各種 Add-in 的加載。
新開工程測驗。
uj5u.com熱心網友回復:
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
又試了一下,回傳的結果也是5,也是錯誤的,看來是不穩定,到底是怎么回事呢?CopyMemory 真不敢用了。
uj5u.com熱心網友回復:
你的系統不能用才是真的!uj5u.com熱心網友回復:
我在機上試了一下,結果:sBuffer(1)應該等于1,正常我機上的宣告是這樣的
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
uj5u.com熱心網友回復:
最新研究結果如下:
完整的代碼如下:
Public Function SendSKQ(ByVal iBiaohao As Long, ByVal ihuhao As Integer, Optional ByVal iShukaqiBH = 65535) As Integer
Dim sql As String, rs As New ADODB.Recordset
' 當iShukaqiBH 為65535的值時, iShukaqiBH 從資料庫中提取
If iShukaqiBH = 65535 Then
sql = " select 刷卡器編號 from yhxx where 表號= " & iBiaohao & " and 戶號= " & ihuhao & ""
rs.Open sql, Conn, adOpenKeyset, adLockReadOnly
If rs.RecordCount > 0 Then
iShukaqiBH = Val(rs.Fields("刷卡器編號"))
else
iShukaqiBH=1
end if
End If
Dim sBuffer(8) As Byte
For i = 0 To 7
sBuffer(i) = 0
Next i
’ 1、的內容開始*****************************
Call CopyMemory(sBuffer(1), iShukaqiBH, 2) ' sBuffer(1), 結果為5
’ 1、的內容結束********************************
'如果按2來執行 sBuffer(1) 結果是正常的為1
’2的內容如下 開始***************************************
Dim sShukaqiBH As Long
sShukaqiBH = iShukaqiBH
Call CopyMemory(sBuffer(1), sShukaqiBH, 2)
'2的內容結束 ********************************************
End function
這個問題是不是根iShukaqiBH這個引數的optional 屬性有關系?
uj5u.com熱心網友回復:
我測驗的結果,沒有任何差別。微軟提供的 API Viewer 給出的就是:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
uj5u.com熱心網友回復:
最新研究結果如下:
完整的代碼如下:
Public Function SendSKQ(ByVal iBiaohao As Long, ByVal ihuhao As Integer, Optional ByVal iShukaqiBH = 65535) As Integer
Dim sql As String, rs As New ADODB.Recordset
' 當iShukaqiBH 為65535的值時, iShukaqiBH 從資料庫中提取
If iShukaqiBH = 65535 Then
sql = " select 刷卡器編號 from yhxx where 表號= " & iBiaohao & " and 戶號= " & ihuhao & ""
rs.Open sql, Conn, adOpenKeyset, adLockReadOnly
If rs.RecordCount > 0 Then
iShukaqiBH = Val(rs.Fields("刷卡器編號"))
else
iShukaqiBH=1
end if
End If
Dim sBuffer(8) As Byte
For i = 0 To 7
sBuffer(i) = 0
Next i
’ 1、的內容開始*****************************
Call CopyMemory(sBuffer(1), iShukaqiBH, 2) ' sBuffer(1), 結果為5
’ 1、的內容結束********************************
'如果按2來執行 sBuffer(1) 結果是正常的為1
’2的內容如下 開始***************************************
Dim sShukaqiBH As Long
sShukaqiBH = iShukaqiBH
Call CopyMemory(sBuffer(1), sShukaqiBH, 2)
'2的內容結束 ********************************************
End function
這個問題是不是根iShukaqiBH這個引數的optional 屬性有關系?
uj5u.com熱心網友回復:
你認為 iShukaqiBH 肯定是 1,所以懷疑 CopyMmemory 結果不對?

uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
經測驗結果是1
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
Dim sBuffer(5) As Byte, iShukaqiBH As Long, i As Long
For i = 0 To 4
sBuffer(i) = 0
Next i
iShukaqiBH = 1
Call CopyMemory(sBuffer(1), iShukaqiBH, 2)
Print sBuffer(1)
End Sub
uj5u.com熱心網友回復:
kernel32 是什么。。。
uj5u.com熱心網友回復:
在執行Call CopyMemory(sBuffer(1), iShukaqiBH, 2)前,每次都查看過了,iShukaqiBH是等于1呀。
sBuffer(1)沒有理由為5呀。
uj5u.com熱心網友回復:
其實要搞清你的疑問的最簡單直接的方法,就是用你開貼的代碼去測驗,而不是什么完整代碼。當然,在你要確定最終問題出在哪里的時候,不妨在 Call CopyMemory(sBuffer(1), iShukaqiBH, 2) 陳述句之前,加上一句 Debug.Print iShukaqiBH。
Debug 就是要測驗,不能拍腦袋,更不能拍胸脯。
uj5u.com熱心網友回復:
Optional ByVal iShukaqiBH as long= 65535
Call CopyMemory(sBuffer(1),byval iShukaqiBH, 4)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/150637.html
標籤:VB基礎類
