下面的函数中用到了CopyMemory,在调试时有时出错,但编译到exe后每次运行都出错。
如过把20000改小点如20则不出错,哪位大虾知道这是怎么回事,如何解决?Private Function Test()
Dim sSource As String
Dim source() As Byte
Dim dest() As Byte
Dim nLength As Long
sSource = String(20000, "0")
nLength = LenB(sSource)
ReDim source(nLength - 1)
CopyMemory source(0), ByVal sSource, nLength
MsgBox "OK"
End Function
如过把20000改小点如20则不出错,哪位大虾知道这是怎么回事,如何解决?Private Function Test()
Dim sSource As String
Dim source() As Byte
Dim dest() As Byte
Dim nLength As Long
sSource = String(20000, "0")
nLength = LenB(sSource)
ReDim source(nLength - 1)
CopyMemory source(0), ByVal sSource, nLength
MsgBox "OK"
End Function
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
试试这些招
CopyMemory byval varptr(source(0)), ByVal sSource, nLength
CopyMemory source(0), ByVal strptr(sSource), nLength
CopyMemory byval varptr(source(0)), ByVal strptr(sSource), nLength我现在没环境,没法帮你试,你看那个对
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
"kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long)Private Function Test()
Dim sSource As String
Dim Source() As Byte
Dim dest() As Byte
Dim nLength As Long
nLength = 20000
sSource = String(nLength, "0")
ReDim Source(nLength - 1)
CopyMemory Source(0), ByVal sSource, nLength
MsgBox "OK"
End Function
我发现:
这样拷贝后并不是想象中的:
Source(2i)=48(字符"0"的ASCII值),Source(2i + 1)=0 (i=0~9999);
而是:Source( i)=48(字符"0"的ASCII值),Source(9999+i)=0 (i=0~9999)。
即Source()数组的后10000个字节中没有拷贝到东西!
而且:
随便什么字符串(如"abcd....yz"),拷贝后数组中只有前一半(如:26个字节)。
估计是API函数自动处理了 UniCode 与 ANSI 的转换
接上面的发现,干脆这样做:CopyMemory Source(0), ByVal sSource, nLength/2 就OK!
应该是这样:
nLength = LenB(sSource)/2
ReDim source(nLength - 1)
CopyMemory source(0), ByVal sSource, nLength
反正后一半拷了也没用:)
Gujianda你说的我也发现了。
当字符串的内容是ascii字符时:比如"aaaaaaaaaa",CopyMemory后Byte数组前10个字节是对的,后10个字节是胡说八道,估计已经溢出了,因此有时会出错(没出错是因为溢出后的内存刚好是可用的)。但字符串是非ascii时,比较“哈哈哈哈哈哈哈哈哈哈”,CopyMemory后20个字节都是有用的内容。vb的字符串据说是unicode的,竟然是这种表现,真是让人失望,大家以后用的时候小心一些。