下面的函数中用到了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

解决方案 »

  1.   

    試試將 CopyMemory 改成 CopyMemoryVlm
      

  2.   

    是不是没声明api函数阿'api函数声明  拷贝内存
    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我现在没环境,没法帮你试,你看那个对
      

  3.   

    用它取得长度比较准确些.
    Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
      

  4.   

    你这样写呢?Option ExplicitPrivate Declare Sub CopyMemory Lib _
        "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
      

  5.   

    关注!
    我发现:
        这样拷贝后并不是想象中的:
              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 的转换
      

  6.   

    目前的进展:
        接上面的发现,干脆这样做:CopyMemory Source(0), ByVal sSource, nLength/2 就OK!
      

  7.   

    更正:
        应该是这样:
            nLength = LenB(sSource)/2
            ReDim source(nLength - 1)
            CopyMemory source(0), ByVal sSource, nLength
        反正后一半拷了也没用:)
      

  8.   

    谢谢各位。
    Gujianda你说的我也发现了。
    当字符串的内容是ascii字符时:比如"aaaaaaaaaa",CopyMemory后Byte数组前10个字节是对的,后10个字节是胡说八道,估计已经溢出了,因此有时会出错(没出错是因为溢出后的内存刚好是可用的)。但字符串是非ascii时,比较“哈哈哈哈哈哈哈哈哈哈”,CopyMemory后20个字节都是有用的内容。vb的字符串据说是unicode的,竟然是这种表现,真是让人失望,大家以后用的时候小心一些。