dim sBuffer(5) as byte , iShukaqiBH as long ,i as long for i=0 to 4
sBuffer(i)=0
next iiShukaqiBH =1Call CopyMemory(sBuffer(1), iShukaqiBH, 2)CopyMemory函数执行完后,sBuffer(1)应该等于1 ,而现在的结果是等5,请问是怎么回事。
sBuffer(i)=0
next iiShukaqiBH =1Call CopyMemory(sBuffer(1), iShukaqiBH, 2)CopyMemory函数执行完后,sBuffer(1)应该等于1 ,而现在的结果是等5,请问是怎么回事。
解决方案 »
- 难道这个是VB6的超级大坑?
- 请问用RST.ADDNEW 和CONN.EXCUTE (addsql) 有什么分别哦
- 老板要在我电脑上装监视软件,我不同意,各位水友你们公司也给员工装监视软件吗??
- ==== 请教 : 如何制作自动升级/更新 程序 ====
- 如何设置MSFLexgrid一行的颜色??
- 急~~~~菜鸟求助:在VB中如何读取二值图像的像素值,保存在一个数组中
- 数据库统计如何自动产生序号?
- 请问各位大侠都用什么调试ASP程序?
- 请教一个小问题!!!
- 高手们,请帮忙!好急!!!我要交货了!做报表的问题??
- 求购完整的超市POS管理软件源代码
- 为什么我在自己创建的activex dll里面生成的错误,在调用的主进程中捕获不到?
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
非常感谢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 是正确的请问,这到底是为什么呢,谢谢。还有为什么这一个函数可以有多个声明方式呢,得到的结果还不一样?
正因为原型的任意性,VB 中可以通过声明中参数的变化来对应具体的数据结构。
如果声明和应用不匹配。轻则出错,重则崩溃。要用好API,不仅基础知识要好,语言也要很精深。
因为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)两个声明实际上应该是完全一下的呀,为什么结果会有两个呢?
kernel32.dll 这不是一个系统文件吗,调用这个COPYMEMORY函数时,不从kernel32.dll中调用,还能到其他的文件比如kernel32.ccc中调用吗,不可能吧
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)得到的结果还是结果还是5
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
又试了一下,返回的结果也是5,也是错误的,看来是不稳定,到底是怎么回事呢?CopyMemory 真不敢用了。
我机上的声明是这样的
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
最新研究结果如下:完整的代码如下:
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 属性有关系?
最新研究结果如下:完整的代码如下:
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 属性有关系?
经测试结果是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
在执行Call CopyMemory(sBuffer(1), iShukaqiBH, 2)前,每次都查看过了,iShukaqiBH是等于1呀。sBuffer(1)没有理由为5呀。
最新研究结果如下:完整的代码如下:
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 属性有关系?Optional ByVal iShukaqiBH as long= 65535
Call CopyMemory(sBuffer(1),byval iShukaqiBH, 4)